算法第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

55 阅读2分钟

前言

有点想摆烂了

110.平衡二叉树

力扣题目链接(opens new window)

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

110.平衡二叉树

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

110.平衡二叉树1

返回 false 。

思路

递归判断左右子树的高度。不太好想细节

代码

 public boolean isBalanced(TreeNode root) {
    return getHeight(root) != -1;
}

private int getHeight(TreeNode root) {
    if (root == null) {
        return 0;
    }
    int leftHeight = getHeight(root.left);
    if (leftHeight == -1) {
        return -1;
    }
    int rightHeight = getHeight(root.right);
    if (rightHeight == -1) {
        return -1;
    }
    // 左右子树高度差大于1,return -1表示已经不是平衡树了
    if (Math.abs(leftHeight - rightHeight) > 1) {
        return -1;
    }
    return Math.max(leftHeight, rightHeight) + 1;
}

注意

注意-1的作用

257. 二叉树的所有路径

力扣题目链接(opens new window)

给定一个二叉树,返回所有从根节点到叶子节点的路径。

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

示例: 257.二叉树的所有路径1

思路

这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。

在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一一个路径在进入另一个路径。

前序遍历以及回溯的过程如图:

257.二叉树的所有路径

代码

public List<String> binaryTreePaths(TreeNode root) {
    ArrayList<String> res = new ArrayList<>();
    if (root == null) {
        return res;
    }
    List<Integer> paths = new ArrayList<>();
    traversal(root,paths, res);
    return res;
}

public void traversal(TreeNode root, List<Integer> paths, List<String> res) {
    paths.add(root.val);
    if (root.left == null && root.right == null) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < paths.size()-1; i++) {
            stringBuilder.append(paths.get(i)).append("->");
        }
        stringBuilder.append(paths.get(paths.size() - 1));
        res.add(stringBuilder.toString());
        return;
    }
    if (root.left != null) {
        traversal(root.left, paths, res);
        paths.remove(paths.size() - 1);
    }
    if (root.right != null) {
        traversal(root.right, paths, res);
        paths.remove(paths.size() - 1);
    }

}

注意

paths.add(root.val);必须放在前面

404.左叶子之和

力扣题目链接(opens new window)

计算给定二叉树的所有左叶子之和。

示例:

404.左叶子之和1

思路

递归就完事了

代码

public static int count = 0;

public int sumOfLeftLeaves(TreeNode root) {

    find(root);
    return count;
}

public void find(TreeNode root,) {
    if (root == null) {
        return;
    }
    if (root.left != null && root.left.right == null && root.left.right == null) {
        count += root.left.val;
    }
    find(root.left);
    find(root.right);
}

注意

呜呜呜,静态变量力扣里好像不刷新,这个应该能过,呜呜呜呜

结束

今天状态不好,笔记没太好好写。哎