Skip to content

二叉树与递归 - 深入理解

来源:基础算法精讲 by 灵茶山艾府

题目代码备注
104. 二叉树的最大深度代码两种方法
111. 二叉树的最小深度代码*课后作业
404. 左叶子之和代码*课后作业
112. 路径总和代码*课后作业
129. 求根节点到叶节点数字之和代码*课后作业
1448. 统计二叉树中好节点的数目代码*课后作业
987. 二叉树的垂序遍历代码*课后作业

题目

最大深度

js
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxDepth = function(root) {
    //使用递归
    //归的时候要加自己的深度?

    //boudary
    if(!root) return 0;
    const l = maxDepth(root.left);
    const r = maxDepth(root.right);
    return Math.max(l,r) + 1;
};

习题

111.二叉树的最小深度

js
//层序遍历
var minDepth = function (root) {
    //boudary
    if (!root) return 0;
    //要进行判空,否则把null节点的子树也算进去了; 左边null就去右边
    if (!root.left) return minDepth(root.right) + 1;
    if (!root.right) return minDepth(root.left) + 1;
    
    return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
};

404.左叶子之和

  • 如何判断一个节点是叶子
  • 思路:递归,函数返回sum,递到叶子,再拿和,通过return进行传递
js
/**
 * @param {TreeNode} root
 * @return {number}
 */
var sumOfLeftLeaves = function (root) {
    //边界条件
    if (!root) return 0;

    //左右两边树的左叶子
    let sum = sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right);

    let node = root.left;
    //判断是左叶子,两个子节点null,最终,然后return的时候带上.val就行了
    if (node && node.left === null && node.right === null) sum += node.val;
    //注意这里不是.value

    //通过这个sum来进行一个值传递,如果不是叶子就return0了
    return sum;

};

112.路径总和

129.求根节点到叶节点数字之和

1448.统计二叉树中好节点的数目

二叉树的垂序遍历