数据结构与算法-求二叉树的最大深度,总节点个数,叶子节点个数【九】

标签(空格分隔): 二叉树深度 节点


对应着leetcode的题目编号是: 104,222

思路一

这3个问题,最简单的办法就是定一个全局变量,然后遍历整棵树,最后对全局变量进行处理或者返回即可。【可以理解为自上而下,从根节点开始往下面走】

求二叉树最大深度:

 var maxDepth = (root) => {
     if (!root) return 0
     const arr = []
     // 遍历所有,直到叶子节点
     var helpFunc = (node, i = 1) => {
         if (node) {
             if (!node.left && !node.right) {
                 arr.push(i)
             }
            helpFunc(node.left, i+1)
            helpFunc(node.right, i+1)
         }
     }
     helpFunc(root)
     return Math.max(...arr)
 }

求总节点个数

var countNodes = (root) => {
    let i = 0;
    const helpFunc = (node) => {
        if (node) {
            i++
            helpFunc(node.left)
            helpFunc(node.right)
        }
    }
    helpFunc(root)
    return i
};

求叶子节点个数:

var countLeafNodes = (root) => {
    let i = 0
    const helpFunc = (node) => {
        if (node ) {
            if (!node.left && !node.right) {
                i++
            }
            helpFunc(node.left)
            helpFunc(node.right)
        }
    }
    helpFunc(root)
    return i
}

思路二

上面其实已经达到题目要求了,咱们尝试初始化在树的底层叶子节点来初始化数据,一层一层往上面返回。

求二叉树最大深度,从根节点开始,最大深度为 Math.max(左子树的最大深度,右子树的最大深度比较)+ 1;左子树的最大深度, 仍然是相对于左子树的根节点来说Math.max(左子树的最大深度,和右子树的最大深度比较)+ 1,是的,递归。但是和上面比起来,是自下而上。

求二叉树最大深度:

var maxDepth = function(root) {
    if (root == null) {
        return  0
    } else {
        const leftMax =  maxDepth(root.left) 
        const rightMax = maxDepth(root.right)
        return Math.max(leftMax, rightMax) + 1
    }
};

求总节点个数

var countNodes = function(root) {
    if (root == null) {
        return 0
    } else {
        const m = countNodes(root.left) 
        const n = countNodes(root.right)
        return m + n + 1
    }
};

求叶子节点个数:

var countLeafNodes = (root) => {
    if (root == null) {
        return 0
    }
    if (!root.left && !root.right) {
        return 1
    }
    return countLeafNodes(root.left) + countLeafNodes(root.right)
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你可以将这些问题分开来回答。首先,计算一棵二叉树深度可以使用递归算法,代码如下: ```python def depth(node): if node is None: return 0 else: left_depth = depth(node.left) right_depth = depth(node.right) return max(left_depth, right_depth) + 1 ``` 其中,如果节点为空,则深度为0;否则,递归计算左子树和右子树的深度,然后返回左右子树深度的最大值再加上1。 接下来,计算二叉树的总节点个数同样可以使用递归算法,代码如下: ```python def count_nodes(node): if node is None: return 0 else: left_count = count_nodes(node.left) right_count = count_nodes(node.right) return left_count + right_count + 1 ``` 其中,如果节点为空,则节点个数为0;否则,递归计算左子树和右子树的节点个数,然后返回左右子树节点个数之和再加上1。 最后,计算二叉树叶子节点个数同样可以使用递归算法,代码如下: ```python def count_leaves(node): if node is None: return 0 elif node.left is None and node.right is None: return 1 else: left_count = count_leaves(node.left) right_count = count_leaves(node.right) return left_count + right_count ``` 其中,如果节点为空,则叶子节点个数为0;如果节点的左右子树均为空,则该节点叶子节点叶子节点个数为1;否则,递归计算左子树和右子树的叶子节点个数,然后返回左右子树叶子节点个数之和。 希望这些算法对你有帮助,如有疑问请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值