Skip to content

104 二叉树最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

题解

从后序遍历出发。还是递归三部曲, 递归的参数,递归的终止条件以及递归的单层逻辑

递归的参数是root,返回值是boolean

递归的终止条件,当root为空时,返回高度为0

单层逻辑,找左右子树的最大深度加当前的深度(1)

javascript
var maxDepth = function(root) {
    if (!root) return 0
    const depthLeft = maxDepth(root.left)
    const depthRight = maxDepth(root.right)

    //目前深度
    // +1 表示目前这层要加1
    const currentMaxDepth = Math.max(depthLeft, depthRight) + 1

    return currentMaxDepth
};

前序遍历过程

前序遍历的过程是个回溯的过程,先左子树,然后遍历完后回到上一级然后右子树的模式。

javascript
var maxDepth = function(root) {
    var result = 0
    var preOrder = function(root, depth) {
        result = Math.max(result, depth)

        // 終止條件
        if(!root) {
            return
        }

        if(root.left) {
            preOrder(root.left, depth + 1)
        }
        if(root.right) {
            preOrder(root.right, depth + 1)
        }
    }
    if(!root) {
        return 0
    }

    //当前是1层
    preOrder(root, 1)
    return result
}

层序遍历解法

利用层序遍历就可以非常方便的获取到最大深度,只要看有多少层就知道最大的深度。

先把层序遍历的代码搬出来

javascript
var maxDepth = function(root) {
    var levelOrder = function(root) {
        const queue = []
        const result = []
        if(!root) {
            return result
        }

        queue.push(root)
        while(queue.length) {
            const size = queue.length

            const temp = []

            for(let i=0;i<size;i++) {
                const current = queue.shift()
                temp.push(current.val)
                if(current.left) {
                    queue.push(current.left)
                }
                if(current.right) {
                    queue.push(current.right)
                }
            }
            result.push(temp)
        }

        return result
    }
}

然后我们只需要替换成深度的变量来存储深度就行。

javascript
var maxDepth = function(root) {
    var levelOrderMaxDepth = function(root) {
        const queue = []
        // 拿一个变量存储最大深度
        let result = 0
        if(!root) {
            return result
        }

        queue.push(root)
        while(queue.length) {
            const size = queue.length

            result++

            for(let i=0;i<size;i++) {
                const current = queue.shift()
                //temp.push(current.val)
                if(current.left) {
                    queue.push(current.left)
                }
                if(current.right) {
                    queue.push(current.right)
                }
            }
            //result.push(temp)
        }

        return result
    }

    return levelOrderMaxDepth(root)
}

上次更新于: