力扣算法打卡第十六天(链表) | 104. 二叉树的最大深度、111. 二叉树的最小深度、222. 完全二叉树的节点个数

104. 二叉树的最大深度

题目链接:力扣
思路:dfs

注意分清二叉树高度和深度的区别,以及分别用什么遍历方式。

根节点的高度是二叉树的最大深度,所以使用后序遍历算出根节点的高度,即是二叉树的最大深度。

也可以使用回溯的思想,用前序遍历。

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        
        def getHeight(cur):
            if cur == None: 
                return 0  # 叶子节点高度为1,它的下面高度为0
            leftHeight = getHeight(cur.left)
            rightHeight = getHeight(cur.right)
            height = max(leftHeight, rightHeight) + 1
            return height
        
        return getHeight(root)

111. 二叉树的最小深度

题目链接:力扣
思路:dfs

注意根节点“不算”叶子结点。左右孩子都为空的结点才是叶子结点。
注意与上一题的区别。
如下图,最小深度应该为4,因为只有4和5才是叶子结点,而不是1或2。
在这里插入图片描述

在这里插入图片描述

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:

        def getHeight(cur):
            if cur == None:
                return 0
            leftheight = getHeight(cur.left)
            rightheight = getHeight(cur.right)
			
			# 注意这里的处理
            if cur.left == None and cur.right != None:
                return rightheight + 1
            if cur.left != None and cur.right == None:
                return leftheight + 1
            else:  
                return min(leftheight, rightheight) + 1
        
        return getHeight(root)

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

题目链接:力扣
思路:dfs
普通二叉树解法:
后序遍历或层序遍历均可。

class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:

        def dfs(cur):
            if(cur == None):
                return 0
            leftNum = dfs(cur.left)
            rightNum = dfs(cur.right)
            curNum = leftNum + rightNum + 1
            return curNum
        
        return dfs(root)

利用完全二叉树性质的解法:
终止条件时特判一下当前树是否为满二叉树,若为满二叉树:利用满二叉树公式,节点数 = 2^树深度 - 1。
若不是,按普通二叉树计算。

class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:

        def dfs(cur):
            # 终止条件
            if(cur == None):
                return 0
            leftDepth = 0
            rightDepth = 0
            left = cur.left
            right = cur.right
            # 二叉树左侧和右侧最外面一直向下指,算出深度
            # 若左右深度相等,则为满二叉树,直接用公式算结点
            while left != None:
                left = left.left
                leftDepth += 1
            while right != None:
                right = right.right
                rightDepth += 1
            if leftDepth == rightDepth:
                return pow(2, leftDepth+1) - 1  #公式
            # 单层递归逻辑,同普通二叉树解法
            leftNum = dfs(cur.left)
            rightNum = dfs(cur.right)
            curNum = leftNum + rightNum + 1
            return curNum
            
        return dfs(root)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值