✅✅代码随想录算法训练营Day17|| 110.平衡二叉树 ,257.二叉树的所有路径,404.左叶子之和

75 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情🚀🚀

110. 平衡二叉树 - 力扣(LeetCode)

image.png

后序遍历

var isBalanced = function(root) {
    if(!root){
        return root
    }
    let flag = true
    const dfs = (root) => {
        if(!root)
        return 0;
        let left = dfs(root.left)
        let right = dfs(root.right);
        if(Math.abs(left-right) > 1){
            flag = false
        }
        return 1 + Math.max(left,right)
    }
    dfs(root)
    return flag
};

解法和求最大深度很相似,不同的地方就是多了一层判断条件

if(Math.abs(left-right) > 1){
     flag = false
}

257. 二叉树的所有路径 - 力扣(LeetCode)

image.png

递归

var binaryTreePaths = function(root) {
    if(!root)
        return root;
    let res = [];
    let cur = '';
    const dfs = (root,cur) => {

        if(!root.left && !root.right ){
             cur += root.val;
            res.push(cur);
            return 
        }
        else{
            cur += root.val +  '->';
            root.left && dfs(root.left,cur);
            root.right && dfs(root.right,cur)
        } 
    }
    dfs(root,cur)
    return res
 
};

1.字符串的拼接和数组的增加不要弄混了,字符串直接用+拼接

2.root.left && dfs(root.left,cur); 一种简写方式

3.临界条件的判断

 if(!root.left && !root.right ){
             cur += root.val;
            res.push(cur);
            return 
  }

404. 左叶子之和 - 力扣(LeetCode)

image.png

后序遍历

var sumOfLeftLeaves = function(root) {
    if(!root)
    return root;
    const dfs = (root) => {
        if(!root)
            return 0;
        let left = dfs(root.left)
        let right = dfs(root.right);
        let mid = 0;
        if(root.left && root.left.left == null && root.left.right == null){
             mid = root.left.val;
        }
        let sum =   left + right + mid;
    return sum
    }
    return dfs(root);

};

难点

这里的难点就是怎样判断是否为左叶子节点?

概念是这样的:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

这里再放卡哥两张图理解一下

image.png

那么下面这张呢?

image.png 那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。

如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子