代码随想录的第十五天(二叉树)

86 阅读1分钟

代码随想录的第十五天(二叉树)

110. 平衡二叉树

递归法:
var isBalanced = function(root) {
    function deep (root) {
        if (root === null) return 0
        let left = deep(root.left)
        if (left === -1) return -1
        let right = deep(root.right)
        if (right === -1) return -1
        if (Math.abs(left - right) <= 1) {
            return 1+Math.max(left, right)
        } else {
            return -1
        }
    }

    return deep(root) !== -1
};
思路:

1、采用后续遍历的思路

2、借鉴求解最大深度思路,首先需要得出左子树和右子树的高度,然后去进行比较,如果是不是平衡二叉树就直接返回-1,否则就返回当前节点的高度

3、如果当前节点的高度是-1的话,说明他已经不是平衡二叉树,就一层层返回到最上面的节点就行

257. 二叉树的所有路径

递归法:
var binaryTreePaths = function(root) {
    let res = []
    function getPath(root, path) {
        if (root.left === null && root.right === null) {
            path += root.val
            res.push(path)
            return
        }
        path += root.val + '->'
        if (root.left) getPath(root.left, path)
        if (root.right) getPath(root.right, path)
    }

    getPath(root, '')
    return res
};
思路:

1、首先需要定义传入的参数:当前节点和走完一条的路径的path

2、确定终止条件:就是在遍历到最后左右子节点为空,说明下面没有了,就终止

3、过程:每次进行路径的拼接,在最后一个子节点的时候因为要进行返回了,所以需要拼接上当前的子节点

404. 左叶子之和

递归法
var sumOfLeftLeaves = function(root) {
    let sum = 0
    function getSum (node) {
        if (node === null) return 0
        if (node.left === null && node.right === null) return 0 
        let left = getSum(node.left)
        let right = getSum(node.right)
        let midValue = 0;
        if (node.left !== null && node.left.left === null && node.left.right === null) {
            midValue = node.left.val
        }
        sum = midValue + left + right
        return sum
    }
    getSum(root)
    return sum
};
思路:

1、难点是需要确认终止条件:左叶子节点的判断方式是,当前节点有左叶子节点,并且左叶子节点没有左叶子节点和右叶子节点,那么这个左叶子节点就是左叶子节点

2、后续遍历,当当前节点为空返回0

3、根据左叶子节点定义得出左叶子节点的值,然后相加返回