• 代码随想录算法训练营二十四期第十七天|LeetCode110. 平衡二叉树、LeetCode257. 二叉树的所有路径、LeetCode404. 左叶子之和


    一、LeetCode110. 平衡二叉树

    题目链接:110. 平衡二叉树

    利用函数递归,分别计算出左右子树的高度,然后判断做右子树的高度差是否大于1,如果大于1,返回-1,表明该树不是二叉树,否则返回做右子树的高度最大值加一。

    代码如下:

    1. class Solution {
    2. public int maxDepth(TreeNode root) {
    3. if(root == null) return 0;//如果当前节点为空,返回当前高度0
    4. int leftHigh = maxDepth(root.left);//如果有左子树,返回左子树的高度
    5. if(leftHigh == -1) return -1;//用-1标记概述已经不是平衡二叉树
    6. int rightHight = maxDepth(root.right);//如果有右子树,返回右子树的高度
    7. if(rightHight == -1) return -1;
    8. return Math.abs(leftHigh - rightHight) > 1 ? -1 : (rightHight > leftHigh ? rightHight + 1 : leftHigh + 1);//如果做右子树的高度差大于1,返回-1表示该树不是平衡二叉树,否则返回做右子树的最大高度加一
    9. }
    10. public boolean isBalanced(TreeNode root) {
    11. return maxDepth(root) == -1 ? false : true;//函数如果返回的是-1说明不是平衡二叉树,否则是平衡二叉树
    12. }
    13. }

    二、LeetCode257. 二叉树的所有路径

    题目链接:257. 二叉树的所有路径

    先处理头节点(头节点是所有路径的开头,直接添加到路径字符串当中),然后通过递归方法遍历每一条路径,找到叶子节点时,将路径放到外部定义的一个结果集当中。最后将结果集返回即可。

    具体代码如下:

    1. class Solution {
    2. List<String> arr = new ArrayList<String>();
    3. public void travelRoad(TreeNode root, String road) {
    4. if(root.left == null && root.right == null) {//找到叶子节点,将路径放到结果集,返回
    5. arr.add(road);
    6. return;
    7. }
    8. if(root.left != null) {//如果左节点不为空,将左节点放入路径上
    9. travelRoad(root.left, road + "->" + Integer.toString(root.left.val));
    10. }
    11. if(root.right != null) {//如果右节点不为空将右节点放到路径
    12. travelRoad(root.right, road + "->" + Integer.toString(root.right.val));
    13. }
    14. }
    15. public List<String> binaryTreePaths(TreeNode root) {
    16. String s = Integer.toString(root.val);//先处理头节点,将头节点的值放入路径,头节点为所有路径的开头
    17. travelRoad(root, s);
    18. return arr;
    19. }
    20. }

    三、LeetCode404. 左叶子之和

    题目链接:404. 左叶子之和

    通过递归分别算出左右子树的左叶子节点的总和。

    还要考虑左子节点是左叶子节点的情况。

    最后将三者相加返回即可。

    代码如下:

    1. class Solution {
    2. public int sumOfLeftLeaves(TreeNode root) {
    3. int leftCount = 0;//如果有左叶子节点,记录左叶子节点的值
    4. if(root.left != null && root.left.left == null && root.left.right == null) {
    5. leftCount = root.left.val;
    6. }
    7. int leftSum = 0;//记录左子树的做叶子节点的总和
    8. int rightSum = 0;//记录右子树的左叶子节点值的总和
    9. if(root.left != null) leftSum = sumOfLeftLeaves(root.left);//通过递归函数计算左子树的做叶子节点和
    10. if(root.right != null) rightSum = sumOfLeftLeaves(root.right);//计算右子树的左叶子节点和
    11. return leftSum + rightSum + leftCount;//返回左子树的做叶子节点和加上右子树的左叶子节点的和再加上。
    12. }
    13. }

    总结

    递归二叉树。

  • 相关阅读:
    uniapp小程序刮刮乐抽奖
    Python学习七(线程)
    【无标题】
    快速文本分类(FastText)
    .NET周报【11月第1期 2022-11-07】
    Linux网络编程-网络基础1
    河北2022中国农民丰收节 国稻种芯:主会场活动在塔元庄举行
    java8新特性
    Csharp中表达式树
    RISC-V (五)上下文切换和协作式多任务
  • 原文地址:https://blog.csdn.net/2201_76107580/article/details/134068501