代码随想录算法训练营第十七天| ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和 。

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

题目链接/文章讲解/视频讲解:代码随想录

看完代码随想录之后的想法

我们需要求出每个节点的高度,然后我们需要判断左右节点的高度;

我们需要使用后序遍历来求高度;

如果左右节点返回的是-1 ,说明已经不是平衡了,那我们只需要向上返回-1;

如果两者abs 高度差>1,说明也不平衡;也需要返回 -1;

如果<1,可以求得该节点的高度为max(左子树高度,右子树高度)+ 1;

class Solution {
    int getHeigt(TreeNode root) {
        if(root == null)
        return 0;
        int leftGetHeight = getHeigt(root.left);
        if(leftGetHeight == -1) return -1;
        int rightGetHeight = getHeigt(root.right);
        if(rightGetHeight == -1) return -1;
        if(Math.abs(rightGetHeight - leftGetHeight) > 1)
        return -1;
        return Math.max(rightGetHeight , leftGetHeight) + 1;
    }
    public boolean isBalanced(TreeNode root) {
        if(getHeigt(root) == -1)
        return false;
        return true;
    }
}

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

题目链接/文章讲解/视频讲解:代码随想录

看完代码随想录之后的想法

使用前序遍历,

如果节点的左节点右节点都为 null那么我们可以终止;

单层循环逻辑{

先把节点放入path里

然后遍历左子树{有回溯}

然后遍历右子树{有回溯}

}

class Solution {
    LinkedList<Integer> path = new LinkedList<>();
    List<String> result = new LinkedList<>();
    void backTracking(TreeNode root) {
        path.add(root.val);
        if(root.left == null && root.right == null) {
            StringBuilder str = new StringBuilder();
            for(int i = 0; i < path.size() - 1; i++) {
                str.append(path.get(i)).append("->");
            }
            str.append(path.get(path.size() - 1));
            result.add(str.toString());
            return ;
        }
        
        if(root.left != null) {
            backTracking(root.left);
            path.pollLast();
        }
        if(root.right != null) {
            backTracking(root.right);
            path.pollLast();
        }
    }
    public List<String> binaryTreePaths(TreeNode root) {
        backTracking(root);
        return result;
            }
}

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

题目链接/文章讲解/视频讲解:代码随想录

 看完代码随想录之后的想法

我们用后序遍历;

我们先求出左子树左叶子的和;

再求出右子树左叶子的和;

然后把和加上返回给中节点;

我们需要先判断是否是叶子节点,但是我们无法通过叶子节点判断是否是左叶子节点;

我们在左递归的时候,我们会一直递归到叶子节点,这个时候我们会返回0;因为叶子节点的左子树左叶子之和加上右子树左叶子之和为0;

因为我们执行到了叶子节点,我们就可以判断是否是左叶子,如果是的话

把左子树左叶子和有0 赋值为左叶子的值;

然后递归右子树

class Solution {
    int getLeftSum(TreeNode root) {
        if(root == null)
        return 0;
        if(root.left == null && root.right == null)
        return 0;
        int leftgetLeftSum = getLeftSum(root.left);
        if(root.left != null && root.left.left == null && root.left.right == null)
        leftgetLeftSum = root.left.val;
        int rightgetLeftSum = getLeftSum(root.right);
        return leftgetLeftSum + rightgetLeftSum;
    }
    public int sumOfLeftLeaves(TreeNode root) {
        return getLeftSum(root);
    }
}

自己实现过程中遇到哪些困难 :

最后一个题,挺不好想的,我们如何处理左叶子,因为左叶子是在递归结束的时候哦,因此,我们可以放到左递归后面,进行处理;然后再处理右递归;

我们在递归过程中,

if(root.left != null && root.left.left == null && root.left.right == null)

        leftgetLeftSum = root.left.val;

这一步只会在递归结束的时候执行,因此在整个其余大递归过程中不会执行

class Solution {
    int getLeftSum(TreeNode root) {
        if(root == null)
        return 0;
        if(root.left == null && root.right == null)
        return 0;
        int leftgetLeftSum = getLeftSum(root.left);
        if(root.left != null && root.left.left == null && root.left.right == null)
        leftgetLeftSum = root.left.val;
        int rightgetLeftSum = getLeftSum(root.right);
        return leftgetLeftSum + rightgetLeftSum;
    }
    public int sumOfLeftLeaves(TreeNode root) {
        return getLeftSum(root);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值