• 算法练习-LeetCode Hot 100 543. 二叉树的直径


    今日心情:为了offer冲冲冲!

    题目描述:

    LeetCode Hot 100 543. 二叉树的直径

    给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

     


    解题代码:

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. int maxd=0;
    18. public int diameterOfBinaryTree(TreeNode root) {
    19. if(root == null){return 0;}
    20. int depth = process(root);
    21. System.out.print(depth+" ");
    22. return maxd;
    23. }
    24. public int process(TreeNode x){
    25. if(x == null){return 0;}
    26. int left = process(x.left);
    27. int right = process(x.right);
    28. maxd = Math.max(left+right,maxd); //更新最大路径长度
    29. return Math.max(left,right)+1; //返回根节点最大子树深度
    30. }
    31. }

    解题思路:(看的题解 + 自己的理解)

    递归:找树的左右最大深度,将左右树的最大深度相加然后记录在全局变量中,然后不断递归更新最大值,递归最终完成的时候,已经回溯到最终根节点,此时全局变量记录的就是整个树的最长路径。(主要思想:分别找左右子树的最深的深度,更新最大值,记录最大总路径值)

    递归函数 process(TreeNode x)

    1. public int process(TreeNode x){
    2. if(x == null){return 0;}
    3. int left = process(x.left);
    4. int right = process(x.right);
    5. maxd = Math.max(left+right,maxd); //更新最大路径长度
    6. return Math.max(left,right)+1; //返回根节点最大子树深度
    7. }

    以下面为例子树进行说明👇 

    -- 通过递归x.left一直到x.left为null的时候,返回 0,然后递归当前节点的 x.right为null, 返回0;此时全局变量 maxd 取最大 为0,节点7处 返回max(L,R) +1 为 1;同理节点5 处 返回 max(L,R) +1 为 1。

    --然后到第二层,节点7 返回 1 作为节点9的 Left, 节点5 返回 1 作为节点9 的Right,然后maxd更新为2,此时节点9 返回max(L,R) +1 为 2;而节点8 返回按之前类似节点7和5一样返回1。

            

     -- 然后到最后根节点处,节点9返回2作为根节点3的Left,节点8返回1作为根节点3的Right,此时maxd更新为3,根节点无法再进行回溯,此时递归完成。

     -- 最终最大路径更新为3,返回。


    小结:

    主要是要想到如何获取左右子树的最大深度,然后如何更新最大长度路径。

  • 相关阅读:
    原创->CommonsCollections1-DefaultMap链
    【毕业设计】Django 校园二手交易平台(有源码+mysql数据)
    Redis-cluster集群详细部署配置--有手就行
    JAVA之多线程
    pyinstaller瘦身指南
    服务器被攻击怎么选择更好的方式去防御,IDC说的集防和单机防御都是什么意思
    golang中的并发模型
    腾讯X5浏览器内核静态集成方案
    mybatis插入数据返回指定字段
    【前端】node.js常用命令
  • 原文地址:https://blog.csdn.net/qq_41758969/article/details/125495696