代码随想录-2023/07/14

77 阅读1分钟

二叉树的应用

110.平衡二叉树

递归法: 后序遍历求左右子节点的高度 用 -1 标记当前节点是否平衡, 若不平衡则直接向上层返回 -1 若左右子节点高度不等于-1, 则计算高度差是否满足要求,若满足则继续向上返回当前节点高度

class Solution {
    // 前序遍历求深度---后序遍历求高度
    public boolean isBalanced(TreeNode root) {
        return dfs(root) != -1;
    }
    public int dfs(TreeNode root){
        // 用 -1 标记不平衡
        if(root == null) return 0;
        int left = dfs(root.left);
        int right = dfs(root.right);
        if(left == -1 || right == -1){
            return -1;
        }
        if(Math.abs(left-right) > 1){
            return -1;
        }else {
            return Math.max(left, right) + 1;
        }
    }
}

257.二叉树的所有路径

用字符串拼接路径, 回溯遍历, 到叶子节点就记录结果

class Solution {
    List<String> list = new ArrayList<>();
    public List<String> binaryTreePaths(TreeNode root) {
        backtracking(root, "");
        return list;
    }
    public void backtracking(TreeNode root, String path) {
        if(root.left == null && root.right == null) {
            list.add(path + root.val);
            return;
        }
        if(root.left == null){
            backtracking(root.right, path + root.val + "->");
        }else if(root.right == null) {
            backtracking(root.left, path + root.val + "->");
        }else {
            backtracking(root.left, path + root.val + "->");
            backtracking(root.right, path  + root.val + "->");
        }
        
    }
}

404.左叶子之和

首先肯定是递归遍历处理所有节点 判断是否为左叶子节点:

  1. 当左节点不为空, 且左节点为叶子节点时, 该节点符合要求, 需要记录其值并向上层返回
  2. 同时递归左右子节点
  3. 将所有符合要求的值加起来向上返回和

代码:

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if(root == null) return 0;
        // 找到左叶子节点的值, 从父节点去判断子节点是否为左叶子节点
        int mid = 0;
        if(root.left != null && root.left.left == null && root.left.right == null){
            mid =  root.left.val;
        }

        // 递归处理左右子节点
        int left = sumOfLeftLeaves(root.left);
        int right = sumOfLeftLeaves(root.right);

        return left + right + mid;
    }
}