5.二叉树的最大深度|Java 刷题打卡

329 阅读3分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看<活动链接>

【Java 刷题打卡】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷几道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

😄

 \color{red}{~}

那就干吧! 这个专栏都是刷的题目都是关于二叉树的,我会由浅入深、循序渐进,刷题就是这样需要连续不断的记忆--艾宾浩斯记忆法2121112。二叉树的内容不多,但是都是每个程序员必备的,对了解红黑树、B+树、LSM树都非常有帮助等等

WAL+LSM-tree实现的leveldb和rocksdb

B+ 树的mysql

(HBASE) - LSM-tree的架构把random write转成sequential write,多层的compaction和lookup,存在写放大和读放大

TokuDB索引结构--Fractal Tree

还有更多,值得咱们发掘。

leecode 104. 二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例: 给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。

图片.png


如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为

max(l,r)+1

而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。

参考代码

定义一颗树

class TreeNode {
    int val;          // 头结点
    TreeNode left;    // 左子树
    TreeNode right;   // 右子树

    TreeNode(int x) {
        val = x;
    }
}


// 测试方法
 public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(1);
        treeNode.left = new TreeNode(2);
        treeNode.right = new TreeNode(3);
        System.out.println("xxxx结果 = " + preorderTraversal(treeNode));
}        

JAVA语言版 递归

    /**
     * 递归解法
     * @param root
     * @return
     */
    public static int maxDepth(TreeNode root) {
        if (root == null){
            return 0;
        } else {
            int left_depth = maxDepth(root.left);
            int right_depth = maxDepth(root.right);
            return Math.max(left_depth, right_depth) + 1;
        }
    }

JAVA语言版 迭代

/**
     * 迭代解法
     * @param root
     * @return
     * 1.pair类似于map k,v结构
     * 2.不同点:stack.peek 不改变栈的值(不删除栈顶的值),pop会把栈顶的值删除。 相同点:大家都返回栈顶的值。
     * 总结:left进栈,加深度(出现右节点的左子节点), right:出栈
     */
    public static int maxDepthInIteration(TreeNode root) {
        int depth = 0;
        //1.初始化一个栈
        Stack<Pair<TreeNode, Integer>> stack = new Stack<>();
        TreeNode p = root;
        int current_depth = 0;
        while(p !=null || !stack.isEmpty()){
            if(p!=null){
                stack.push(new Pair(p,++ current_depth)); // 1. stack=k:1,2,3 v:1  4. stack=2,null,null 2  14.3,null,null 2
                depth = Math.max(depth,current_depth); // 2. d=1  5. d=2  15. d=2
                p = p.left; // 3.stack = 2,null,null  6.stack null,null,null size=2  16.null,null,null
            }else{
                current_depth = stack.isEmpty()? 0:stack.peek().getValue(); // 7. cd=2  10. cd=1  17.cd=2
                p = stack.pop().getKey(); // 8.stack 2,null,null  11. stack 1,2,3  18.3,null,null
                p = p.right; // 9. stack null,null,null  12. stack 3,null,nul  19. null,null,null 此时p=null,stack.isEmpty=true
            }
        }
        return depth;
    }

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️