代码随想录Day15

题目列表

● 110.平衡二叉树(LeetCode)
● 257.二叉树的所有路径(LeetCode)
● 404.左叶子之和(LeetCode)
● 222.完全二叉树的节点个数(LeetCode)

解题过程

110.平衡二叉树

题目描述

解题思路

平衡二叉树,左右子树高度差小于等于 1 ,与高度相关,所以使用后序遍历。
使用递归:

  1. 递归函数:返回每个节点的左右子树的高度,如果已经不平衡,返回一个标志
  2. 终止条件:root == NULL,
  3. 递归逻辑:左子树高度,右子树高度,求左右子树高度差,返回对应值

注意事项

递归函数返回值

如果在递归过程中发现左右子树高度差已经超过 1 ,此时没有必要再记录该节点的高度,而是直接返回 -1 即可。

代码展示

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(heightv(root) == -1){
            return false;
        }        
        return true;
    }
    public int heightv(TreeNode node){
        if(node == null) return 0;

        int leftHeight = heightv(node.left);
        if(leftHeight == -1) return -1;

        int rightHeight = heightv(node.right);
        if(rightHeight == -1) return -1;

        if(Math.abs(leftHeight - rightHeight) > 1){
            return -1;
        }else{
            return Math.max(leftHeight,rightHeight) + 1;
        }
        
    }
}

257.二叉树的所有路径

题目描述

解题思路

递归与回溯:
根据题目要求,返回的是所有路径的字符串列表的集合。
递归函数:参数应该有二叉树节点,记录单条路径的节点值的列表,记录路径集合的列表。
终止条件:当遍历到叶子节点时表示这一条路径已经遍历完毕,将单条路径列表中记录的路径转换为对应字符串形式加入结果集,返回。
递归逻辑:从左孩子开始一直递归直到叶子节点,然后回溯,去掉当前孩子节点,再看有没有右孩子,有的话继续递归。

代码展示

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> res = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        if(root == null) return res;
        travelsel(root,path,res);
        return res;
    }
    public void travelsel(TreeNode node, List<Integer> path,List<String> res){
        //节点不为空已判断
        path.add(node.val);
        if(node.left == null && node.right == null){
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < path.size() - 1; i++){
                sb.append(path.get(i)).append("->");
            }
            sb.append(path.get(path.size() - 1));
            res.add(sb.toString());
            return;
        }
        if(node.left != null){
            travelsel(node.left,path,res);
            path.remove(path.size() - 1);
        }
        if(node.right != null){
            travelsel(node.right,path,res);
            path.remove(path.size() - 1);
        }
    }
}

404.左叶子之和

题目描述

解题思路

左叶子:是叶子节点,且是左子树的节点的左孩子,是右子树的节点的左孩子。
递归函数:返回节点的左叶子之和,参数:树的节点
终止条件:当前节点没有左右孩子,返回0,当前节点为空,返回0
递归过程中,每次记录的应该是这个节点的左叶子之和(它的左子树的左叶子和右子树的左叶子)。

代码展示

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if(root == null) return 0;
        return sumLeft(root);
    }
    
    public int sumLeft(TreeNode node) {
        if(node == null) return 0;
        
        int leftValue = 0;
        // 检查左子节点是否是叶子节点
        if(node.left != null && node.left.left == null && node.left.right == null) {
            leftValue = node.left.val;
        } else {
            leftValue = sumLeft(node.left);
        }
        
        int rightValue = sumLeft(node.right);
        
        return leftValue + rightValue; 
    }
}

222.完全二叉树的节点个数(待做)

题目描述
解题思路
注意事项
代码展示

参考资料

代码随想录

posted @ 2025-05-12 10:36  cbdsszycfs  阅读(21)  评论(0)    收藏  举报