python数据结构剑指offer-二叉树的深度

例题

描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。

数据范围:节点的数量满足 0 \le n \le 1000≤n≤100 ,节点上的值满足 0 \le val \le 1000≤val≤100
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)
在这里插入图片描述

假如输入的用例为{1,2,3,4,5,#,6,#,#,7}
返回值:
4
示例2
输入:
{}
返回值:
0

解决方案

方案一:递归实现

class Solution:
    def TreeDepth(self , pRoot: TreeNode) -> int:
        # write code here
        if pRoot is None:
            return 0
#         print(self.TreeDepth(pRoot.left))
        left = self.TreeDepth(pRoot.left)
        print('left',left)
        right = self.TreeDepth(pRoot.right)
        print('right',right)
#         print(self.TreeDepth(pRoot.right))
#         return max(self.TreeDepth(pRoot.left),self.TreeDepth(pRoot.right)) + 1
        max_count = max(left, right) + 1
        print('max_count',max_count)
        return max_count

输出结果

left 0
right 0
max_count 1
left 1
left 0
right 0
max_count 1
left 1
right 0
max_count 2
right 2
max_count 3
left 3
left 0
left 0
right 0
max_count 1
right 1
max_count 2
right 2
max_count 4

递归的时候你可以想象成爬楼梯,比如一共有100层楼梯,你看了一下好长好高啊,怎么办呢?楼顶有宝藏,你不得不冲刺,但是这是100层,得留点体力,然后爬得时候给自己幻想,爬第一层就给自己心里安慰,这就是第一百层,就这样你爬了一百次,总算是来到了楼顶,这就是递归。

根据示例,我们根据爬楼梯案例,可以得出1就是第一百层,然后去找2,然后看到2有左节点,然后去4,发现4没有左右节点,所以执行max_count = max(left, right) + 1,得到4这边得深度是1,然后回去继续执行代码,这个时候到了2,2得左子树得深度为1,右子树到5,然后发现5有左子树,所以去到7,看到7是没有左右子树得,同样执行max_count = max(left, right) + 1,依次类推。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的特点是具有天然的递归结构,可以用递归的方式实现很多操作。 二叉树的节点定义通常包含三个部分:节点值、左子节点和右子节点。在Python中,可以使用类来定义二叉树节点,如下所示: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right ``` 其中,val表示节点的值,left和right分别表示左子节点和右子节点。如果一个节点没有左子节点或右子节点,则可以将其设置为None。 二叉树的遍历方式有三种:前序遍历、中序遍历和后序遍历。其中,前序遍历先访问根节点,然后访问左子树,最后访问右子树;中序遍历先访问左子树,然后访问根节点,最后访问右子树;后序遍历先访问左子树,然后访问右子树,最后访问根节点。 在Python中,可以使用递归的方式实现二叉树的遍历。例如,下面是前序遍历的实现: ```python def preorderTraversal(root): if root is None: return [] res = [] res.append(root.val) res += preorderTraversal(root.left) res += preorderTraversal(root.right) return res ``` 其中,如果当前节点为空,则返回一个空列表;否则,先将当前节点的值加入结果列表,然后递归遍历左子树和右子树,并将结果合并到结果列表中。中序遍历和后序遍历可以使用类似的方式实现。 除了递归遍历外,还可以使用迭代的方式遍历二叉树。例如,下面是使用栈实现前序遍历的实现: ```python def preorderTraversal(root): if root is None: return [] stack = [root] res = [] while stack: node = stack.pop() res.append(node.val) if node.right is not None: stack.append(node.right) if node.left is not None: stack.append(node.left) return res ``` 其中,stack表示一个栈,初始时将根节点入栈。每次从栈中弹出一个节点,将其值加入结果列表中,然后将其右子节点和左子节点依次入栈。这样,下一次弹出的节点就是左子节点,可以保证先访问左子树。中序遍历和后序遍历也可以使用类似的方式实现。 除了遍历外,二叉树还有一些其他的操作,例如查找、插入和删除。这些操作可以使用递归或迭代的方式实现,具体实现方式取决于具体的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值