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

54 阅读2分钟

110. 平衡二叉树

题目链接

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

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

思路

递归法

需要比较节点的高度,要用后序遍历,即左右中。

递归三步曲分析:

    1. 明确递归函数的参数和返回值

参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。

左右子树差值大于1时,返回-1,意味着二叉树已经不是平衡二叉树了;否则返回高度

    1. 明确终止条件

递归的过程中遇到空节点了则终止,返回0,表示当前节点为根节点的树高度为0

  1. 明确单层递归的逻辑

判断以当前传入节点为根节点的二叉树是否为平衡二叉树,要比较其左右子树的差值。

分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

var isBalanced = function(root) {
    function getHeight(node){
        if(node == null) return 0
        let leftHeight = getHeight(node.left)
        if(leftHeight == -1 ) return -1
        let rightHeight = getHeight(node.right)
        if(rightHeight == -1 ) return -1
        if(Math.abs(leftHeight-rightHeight)<=1){
            return 1+Math.max(leftHeight, rightHeight)
        }else{
            return -1
        }
    }
    return getHeight(root) == -1 ? false : true
};

257. 二叉树的所有路径

题目链接

要求:给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

思路

递归+回溯

var binaryTreePaths = function(root) {
    let res = []
    let path = []
    function getRodes(node){
        path.push(node.val) //中,要写在前面,因为当前val也必须加入
        if(node.left == null && node.right == null){
            //终止条件,当到达叶子节点时终止
            let tmp = path.join('->')//不能直接操作path,因为后面path需要回溯
            res.push(tmp)
            return 
        }
        if(node.left) {
            getRodes(node.left)
            path.pop() //回溯
        }
        if(node.right) {
            getRodes(node.right)
            path.pop() //回溯
        }
    }
    getRodes(root)
    return res
};

404. 左叶子之和

题目链接

要求:给定二叉树的根节点 root ,返回所有左叶子之和。

思路

左叶子的定义是节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点,因此我们不是在叶子节点区判断是否符合条件的,而是在左叶子的父节点区判断的。

var sumOfLeftLeaves = function(root) {
    let sum = 0
    function getLeftValue(node){
        if(node == null) return
        if(node.left == null && node.right == null) return  //叶子节点跳出
        if(node.left) getLeftValue(node.left)
        //其实是在叶子节点的前一层收集左节点的
        if(node.left != null && node.left.left == null && node.left.right == null) {
            sum += node.left.val
        }
        if(node.right) getLeftValue(node.right)
    }
   getLeftValue(root)
   return sum
   
};