Day15 || 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

110.平衡二叉树

题目链接:力扣题目链接

思路:最开始思路是迭代传入两个参一个是节点一个是boolean,boolean是true,平衡二叉树不是左右高度要大于一才不属于,如果第一次有高度差boolean修改成false,之后再判断。但是发现只能解决一部分情况不能完全解决高度差大于一。查看题解:递归后续遍历,参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0,分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

class Solution {
    public boolean isBalanced(TreeNode root) {
        return height(root) != -1;
    }

    private int height(TreeNode node) {
        if (node == null) {
            return 0;
        }

        int leftHeight = height(node.left);
        if (leftHeight == -1) return -1; // 左子树不平衡

        int rightHeight = height(node.right);
        if (rightHeight == -1) return -1; // 右子树不平衡

        if (Math.abs(leftHeight - rightHeight) > 1) {
            return -1; // 当前节点不平衡
        }

        return Math.max(leftHeight, rightHeight) + 1; // 返回树的高度
    }
}

257. 二叉树的所有路径

题目链接:力扣题目链接

思路:确定递归函数的参数和返回值:参数就是节点和存储从根节点到当前节点直前的列表,中String的列表。确定终止条件:遇到左右都为空就生成String就加入列表返回。确定单层递归的逻辑:先在节点列表加入当前节点的值(不为空情况),检查左右是否为空,左帝国,右递归,列表减去当前节点准备回溯。

404.左叶子之和

题目链接:力扣题目链接

思路:因为是求左子叶之和,所以条件肯定不能是左子节点,这个左子节点还要其左右子节点为null。用后续遍历先左子叶遍历求和右子叶只是遍历不求和,最后中间节点是左右子叶之和。

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        return die(root);
    }
    public int die(TreeNode node){
        int sum = 0;
        if(node==null){
            return 0;
        }
        if(node.left!=null){
            if(node.left.left==null && node.left.right == null){
                sum += node.left.val;
            }else{
                sum += die(node.left);
            }
        }
        sum += die(node.right);
        return sum;
    }
}

222.完全二叉树的节点个数

题目链接:力扣题目链接

思路:后序遍历递归即可。

题解:因为是完全二叉树,可以递归节点左右子树判断深度,如果深度一致则数量就是2^深度-1,否则就分别进入左右子节点然后继续递归节点左右子树判断深度。

class Solution {
    /**
     * 针对完全二叉树的解法
     *
     * 满二叉树的结点数为:2^depth - 1
     */
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便
        while (left != null) {  // 求左子树深度
            left = left.left;
            leftDepth++;
        }
        while (right != null) { // 求右子树深度
            right = right.right;
            rightDepth++;
        }
        if (leftDepth == rightDepth) {
            return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,所以leftDepth初始为0
        }
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

时间:2.5h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值