代码随想录第十六天104.二叉树的最大深度 111.二叉树的最小深度、222.完全二叉树的节点个数

104.二叉树的最大深度

题目链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/

思路:这个之前使用过层序遍历来解决问题,这里要使用深度优先遍历来解决问题

这里涉及到两个概念:二叉树的高度和深度

深度:任意一个节点到根节点的距离 (前序)

高度:任意一个节点到叶子节点的距离;(后序)

最大深度也就是求根节点到叶子节点的高度,这里用后序遍历

var maxDepth = function(root) {
   const getDepth = (node) => {
        if(node === null) return 0
        const leftDepth = getDepth(node.left)
        const rightDepth = getDepth(node.right)
        let depth = 1 + Math.max(leftDepth, rightDepth)
        return depth
    }

    return getDepth(root)
};

111.二叉树的最小深度

题目链接:. - 力扣(LeetCode)

思路:这个之前也是使用过层序遍历来解决问题,这里要使用深度优先遍历来解决问题;

和上题类似,但要考虑左子树孩子为空但右子树孩子不为空,或是相反的情况来辨别

var minDepth = function (root) {
    const getDepth = (node) => {
        if (node === null) return 0
        let leftDepth = getDepth(node.left)
        let rightDepth = getDepth(node.right)
        let depth
        if (leftDepth === 0) {
            depth = 1 + rightDepth
        } else if (rightDepth === 0) {
            depth = 1 + leftDepth
        } else {
            depth = 1 + Math.min(leftDepth, rightDepth)

        }
        return depth
    }
    return getDepth(root)
};

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

题目链接:. - 力扣(LeetCode)

思路: 完全二叉树的定义;

var countNodes = function(root) {
    function getNodeNum(node) {
        if(node === null) return 0
        let leftNodeNum = getNodeNum(node.left)
        let rightNodeNum = getNodeNum(node.right)
        nodeNum = 1 + leftNodeNum + rightNodeNum
        return nodeNum 
    }
    return getNodeNum(root)
};

这是普通二叉树的节点求法,这里并不了解完全二叉树的求法会有什么区别

看了卡哥的思路:

完全二叉树的特性是除了底层节点,上面的节点都是满的;而底层节点从左到右都是连续的;那么可以根据这一特性去判断子节点是否是满二叉树,如果是满二叉树,那就可以用公式来求出子树的节点数;

var countNodes = function(root) {
    function getNum(node) {
        if(node === null) return 0
        let left = node.left
        let right = node.right
        let leftDepth = 0, rightDepth = 0
        while(left) {
            left = left.left
            leftDepth = leftDepth + 1
        }
        while(right) {
            right = right.right
            rightDepth = rightDepth + 1
        }
        if(leftDepth === rightDepth) {
           return Math.pow(2, leftDepth+1) -1
        }
        let allleftDepth = getNum(node.left)
        let allrightDepth = getNum(node.right)
        return 1 + allleftDepth + allrightDepth
    }
    return getNum(root)
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值