文章目录
- LeetCode题号
 - 104. 二叉树的最大深度
 - 111. 二叉树的最小深度
 - 144. 94. 二叉树的前序、中序遍历(DFS遍历)
 - 589. 589. N 叉树的前、后序遍历
 - 543. 二叉树的直径
 - 102. 二叉树的层序遍历
 
LeetCode题号
- 简单 104. 二叉树的最大深度(DFS遍历法+分治)
 - 简单 111. 二叉树的最小深度(BFS)
 - 简单 144. 二叉树的前序遍历(DFS遍历)
 - 简单 94. 二叉树的中序遍历(DFS遍历)
 - 简单 589. N 叉树的前序遍历(DFS遍历)
 - 简单 590. N 叉树的后序遍历(DFS遍历)
 - 简单 543. 二叉树的直径(分治法)
 - 中等 102. 二叉树的层序遍历(BFS)
 
104. 二叉树的最大深度

方法1:DFS
class Solution {
	int maxDepth = 0;
	int depth = 1;
	public int maxDepth(TreeNode root) {
		traverse(root);
		System.out.println(depth);
		return maxDepth;
	}
	public void traverse(TreeNode root){
		depth++;
		if(root == null) {
			maxDepth = Math.max(maxDepth,depth);
			System.out.println(depth);
			return;
		}
		traverse(root.left);
		traverse(root.right);
		depth--;
	}
}
 
方法2:分治:
- 首先,检查根节点是否为空。如果为空,说明该二叉树为空树,最大深度为 0。因此,返回 0。
 - 如果根节点不为空,递归地计算左子树和右子树的最大深度,并取两者中的较大值。
 - 最后,将较大值加上1,作为当前节点的深度,返回给上层递归调用。
 
class Solution {
    public int maxDepth(TreeNode root) {
		if(root == null) return 0;
		return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
    }
}
 
111. 二叉树的最小深度

 BFS方法:使用了广度优先搜索(BFS)来遍历二叉树的每个节点,并找到最小深度。通过使用队列来存储待处理的节点,并每次取出队列中的第一个节点进行处理,直到找到叶子节点为止。时间复杂度为 O(n),其中 n 是二叉树中的节点数量。
class Solution {
	/**
	 * 函数 minDepth 接受一个二叉树的根节点 root 作为参数,并返回树的最小深度。
	 * @param root
	 * @return
	 */
    public int minDepth(TreeNode root) {
		// 边界条件:根节点为空直接返回
		if(root==null)return 0;
		int deep = 0;
		Queue<TreeNode> queue = new LinkedList<>();
		queue.add(root);
		deep++;
		while (!queue.isEmpty()){
			int qsize = queue.size();
			for (int i = 0; i < qsize; i++) {// 遍历下一层的每个节点
				TreeNode cur = queue.poll();
				// 找到第一个叶子节点,其深度即为答案
				if(cur.left==null&&cur.right==null){// 判断是否为叶子节点
					return deep;
				}
				if(cur.left!=null){
					queue.add(cur.left);
				}
				if(cur.right!=null){
					queue.add(cur.right);
				}
			}
			deep++; // 每一层的深度 + 1
		}
		return deep;
	}
}
 
144. 94. 二叉树的前序、中序遍历(DFS遍历)
DFS前序遍历:
class Solution {
	List<Integer> list = new ArrayList<>(); // 存储遍历结果
	
	public List<Integer> preorderTraversal(TreeNode root) {
		traverse(root);
		return list;
	}
	
	void traverse(TreeNode root){
		if(root == null)return;
		list.add(root.val); // 二叉树的前序遍历位置
		traverse(root.left);
		traverse(root.right);
	}
}
 
DFS中序遍历:
class Solution {
	List<Integer> list = new LinkedList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
		traverse(root);
		return list;
    }
	void traverse(TreeNode root){
		if(root==null)return;
		traverse(root.left);
		list.add(root.val);// 二叉树的中序遍历位置
		traverse(root.right);
	}
}
 
589. 589. N 叉树的前、后序遍历
N叉树没有中序遍历,二叉树前中序遍历后都有。
DFS N叉树前序遍历:
class Solution {
	List<Integer> list = new LinkedList<>();
	public List<Integer> preorder(Node root) {
		DFS(root);
		return list;
	}
	public void DFS(Node root){
		if(root==null)return;
		list.add(root.val);        // 前序位置
		for(Node n:root.children){ // 二叉树是左右两个子树、N叉树是n个子树
			DFS(n);
		}
	}
}
 
DFS N叉树后序遍历:
class Solution {
	List<Integer> list = new LinkedList<>();
	public List<Integer> postorder(Node root) {
		DFS(root);
		return list;
	}
	public void DFS(Node root){
		if(root==null)return;
		for(Node n:root.children){
			DFS(n);
		}
		list.add(root.val);  // 后序位置
	}
}
 
543. 二叉树的直径

 分治:计算每个节点的左右节点的深度之和,最大值即为答案。
class Solution {
	int finalRes = 0;
	public int diameterOfBinaryTree(TreeNode root) {
		int r = maxDepth(root);
		return finalRes;
	}
	int maxDepth(TreeNode root){
		if(root ==null){
			return 0;
		}
		int l = maxDepth(root.left); // 返回左节点的最大深度
		int r = maxDepth(root.right);// 返回右节点的最大深度
		// 后续遍历位置,计算当前左右节点最大深度之和
		int oneRes = l+r;// 当前节点的左右节点深度之和(直径)
		finalRes = Math.max(finalRes,oneRes); // 更新整棵树的最大直径
		return Math.max(l,r)+1;// 返回当前节点的最大深度
	}
}
 
102. 二叉树的层序遍历

BFS:
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
		List<List<Integer>> final_list = new ArrayList<List<Integer>>(); // 存放每一层的list
		if(root == null){
			return final_list;
		}
		Queue<TreeNode> queue = new LinkedList<TreeNode>();
		queue.offer(root);
		while (!queue.isEmpty()) {
			int queuesize = queue.size();
			List<Integer> list = new ArrayList<Integer>();
			for(int i =0; i < queuesize;i++){
				TreeNode node = queue.poll();
				list.add(node.val);
				if(node.left!=null){
					queue.offer(node.left);
				}
				if(node.right!=null){
					queue.offer(node.right);
				}
			}
			final_list.add(new ArrayList<Integer>(list));// 将每一层的结果放入最终结果中
		}
		return  final_list;
    }
}
                


















