LeetCode刷题日记之二叉树的深度

23 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情
1.二叉树的最大深度

题目描述

image.png

解题思路

本题可以采用递归法和二叉树的层序遍历来求二叉树的最大深度。
递归法:
1.确定递归参数和返回值,参数为二叉树的节点,返回值为二叉树的最大深度
2.确定递归终止条件,当节点为null时,return 0
3.确定单层逻辑,求当前节点的左右子树的最大深度的最大值

var maxDepth = function(root) {
    
    var getPath = function(node) {
        if(node == null) return 0

        let leftDep = getPath(node.left)
        let rightDep = getPath(node.right)

        return 1 + Math.max(leftDep,rightDep)
    }

    return getPath(root)
};

层序遍历: 采用一个辅助队列来存放每层数据,每层遍历结束后,二叉树的最大深度加1

var maxDepth = function(root) {
    if (root == null) return 0
    let dep = 0;
    let stack = []
    stack.push(root)
    while(stack.length) {
        const size = stack.length;
        for(let i = 0;i<size;i++){
            const node = stack.shift()
            node.left && stack.push(node.left)
            node.right && stack.push(node.right)
        }
        dep++
    }
    return dep
};

2.二叉树的最小深度

题目描述

image.png

解题思路

本题解法和二叉树的最大深度差不多,需要注意的是,判断递归的终止条件和单层数据处理逻辑有些许不同,最小深度是从根节点到最近叶子节点的最短路径上的节点数量,一定是要到叶子节点(左右子节点未空),9是叶子节点,20不是。

var minDepth = function(root) {
     if(root == null) return 0;
     let leftDep = minDepth(root.left)
     let rightDep = minDepth(root.right)

     if(root.left == null && root.right!==null) { // 非叶子节点
         return 1 +  rightDep
     } else if(root.left !== null && root.right == null) { // 非叶子节点
         return 1 + leftDep
     } else { // 叶子节点
         return 1 + Math.min(leftDep,rightDep)
     }
};

3.完全二叉树的节点个数

题目描述

image.png

解题思路

递归法:
1.确定递归参数和返回值,本题参数为一个节点,返回值为节点个数
2.确定递归终止条件,当节点为空时,返回0
3.确定单层逻辑,计算当前节点的左右子树节点个数

var countNodes = function(root) {
   var getNodeCount = function(node){
       if(node == null) return 0;
       let left = getNodeCount(node.left)
       let right = getNodeCount(node.right)

       return left + right + 1
   }

   return getNodeCount(root)
};

层序遍历所有节点

var countNodes = function(root) {
    if(root === null) return 0
   let count = 0
   const queue = []
   queue.push(root)
   while(queue.length){
       let len = queue.length
       while(len--){
         count++
         const node = queue.shift()
         node.left&&queue.push(node.left)
         node.right&&queue.push(node.right)
       }
   }
    return count
};