树的遍历 之 二叉树的最大深度

447 阅读1分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

题目说的是,给你一棵二叉树,你要找到从根节点到最远叶子节点的深度。

比如说,给你的二叉树是

    1
  /   \
 2     4
      / \
     8  16

这棵树有 3 个叶子节点,分别是 2,8,16。
最远的叶子节点是 8 和 16,根节点到 8 或 16 都有 3 个节点,因此最大深度是 3。

二、思路分析:

这道题考察的树的遍历。

思路:

  1. 递归遍历(DFS
  2. 用队列模拟 层级遍历 (BFS

三、AC 代码:

public class LeetCode_104 {
    
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

    // 递归遍历
    // Time: O(n), Space: (n), Faster:100%
    public int maxDepthWithRecursive(TreeNode root) {
        if (root == null) return 0;
        return Math.max(maxDepthWithRecursive(root.left), 
        maxDepthWithRecursive(root.right)) + 1;
    }

    // 层级遍历,用队列模拟:
    // Time: O(n), Space: (n), Faster:11.57%
    public int maxDepthWithQueue(TreeNode root) {

        if (root == null) return 0;
        int maxDepth = 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);

        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; ++i) {

                TreeNode node = queue.poll();
                if (node.left != null) queue.add(node.left);
                if (node.right != null) queue.add(node.right);
            }
            ++maxDepth;
        }
        return maxDepth;
    }
}

四、总结:

树的遍历模板

树的遍历有四种:

  1. 前序遍历
  2. 中序遍历
  3. 后序遍历
  4. 层级遍历

这里也可以分为:深度优先遍历(DFS广度优先遍历 (BFS

层级遍历:是为广度优先遍历。

其他遍历:是为深度优先遍历。

1. 前序遍历

void traverse(TreeNode root) {
    if (null == root) return;
    
    // 前序遍历的代码
    
    traverse(root.left);
    traverse(root.right);
}

2. 中序遍历

void traverse(TreeNode root) {
    if (null == root) return;
    
    traverse(root.left);
    
    // 前序遍历的代码
    
    traverse(root.right);
}

3. 后序遍历

void traverse(TreeNode root) {
    if (null == root) return;
    
    traverse(root.left);
    traverse(root.right);
    
    // 前序遍历的代码
}

4. 层级遍历

用队列模拟

void traverse(TreeNode root) {
    if (null == root) return;
    
    // 初始化队列,将 root 加入队列
    Queue<TreeNode> q = new LinkedList<>();
    q.offer(root);
    
    while (!q.isEmpty()) {
        TreeNode cur = q.poll();
        
        // 层级遍历代码
        System.out.println(root.val);
        
        if (cur.left != null) q.offer(cur.left);
        if (cur.right != null) q.offer(cur.right);
    }
}