【代码随想录】【二叉树】day16!递归递归递归!二叉树最大深度、最小深度、完全二叉树的节点个数

二叉树最大深度

递归方法

传的参数是根节点,根节点的高度就是二叉树的深度
后序遍历 左右中的顺序,把处理逻辑 即中的位置放到最后

class solution:
    # 最大深度
    def gethigh(self,root:TreeNode)->int:  # 传的参数是根节点,根节点的高度就是二叉树的深度
        # 后序遍历 左右中的顺序,把处理逻辑 即中的位置放到最后,
        if root is None:
            return 0
        left=self.gethigh(root.left)
        right=self.gethigh(root.right)
        high=1+max(left,right)

        return high

层序遍历解法

   def maxdepth(self,root:TreeNode):
        if root is None:return[]
        depth=0
        que=deque()
        que.append(root)
        while len(que)>0:
            depth+=1
            size=len(que)
            while size:
                root=que.popleft()
                size-=1
                if root.left:que.append(root.left)
                if root.right:que.append(root.right)
        return depth

二叉树最小深度

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

!!!!不能直接将gethigh函数的max直接改成min,如果根本没有左子树,那返回的最小深度是0,而不是叶子结点到根节点的节点数量。

在这里插入图片描述

 def gethighmin(self,root)->int: #
        # 后序遍历,左右中,获取左右节点的最小深度,依次向上传递给中间的根节点,得到根节点的最小深度
        if root is None:
            return 0
        left=self.gethighmax(root.left)
        right = self.gethighmax(root.right)
        
        if root.left==None and root.right!=None:
            return 1+right
        
        elif root.right==None and root.left!=None:
            return 1+left
            
        else:
            return 1+min(left,right)

完全二叉树的个数

借助完全二叉树的性质,如果一个节点的子树是一个满二叉树,则该子树的所有节点数量就是2^k-1。
这样就不用遍历所有节点。
【!!那么如何判断一个二叉树是满二叉树】:从根节点开始,向左遍历的次数和向右遍历的次数相等,那么二叉树是满的,可以直接返回节点给根节点

 def numsnodes2(self,root:TreeNode)->int:

        # 终止条件有两个
        #1
        if root is None:
            return 0
        #2
        left=root.left
        leftdepth=0
        right=root.right
        rightdepth=0
        while left:
            left=left.left
            leftdepth+=1

        while right:
            right=right.rigth
            rightdepth+=1

        if leftdepth==rightdepth:
            return 2**(leftdepth)-1
        # 单层递归的逻辑  后序遍历
        leftnums=self.numsnodes2(root.left)
        rightnums=self.numsnodes2(root.right)

        return leftnums+rightnums+1
       
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值