剑指offer ----- 找到树的最长深度

树的层序遍历

将上面的问题转化为层序遍历的一部分问题,那么我们怎么实现层序遍历呢?顺带复习层序遍历吧。

对每一层循环,获得每一层的下一层的全部结点,然后一次循环下去就可以走完全部了。当都没有下面的时候,我们就停止了吧。所以我们会用一个列表保存结果,用一个来干嘛呢?保存每一层的结果。然后就是每一层都会读取下一层。也需要保存吧!

class Solution:
    def levelOrderBottom(self, root):
        queue = []                                                  # 结果列表
        cur = [root]                                                # 接下来要循环的当前层节点,存的是节点
        while cur:                                                  # 当前层存在结点时
            cur_layer_val = []                                      # 初始化当前层结果列表为空,存的是val
            next_layer_node = []                                    # 初始化下一层结点列表为空
            for node in cur:                                        # 遍历当前层的每一个结点
                if node:                                            # 如果该结点不为空,则进行记录
                    cur_layer_val.append(node.val)                 
                     # 将该结点的值加入当前层结果列表的末尾 ,每一层的结点
                    next_layer_node.extend([node.left, node.right])
                     # 将该结点的左右孩子结点加入到下一层结点列表,每一层结点的下一个结点。
            if cur_layer_val:                                       # 只要当前层结果列表不为空
                queue.insert(0, cur_layer_val)                      # 则把当前层结果列表插入到队列首端
            cur = next_layer_node                                   # 下一层的结点变成当前层,接着循环
        return queue     

如何改成找最深的深度呢?

class Solution:
    def TreeDepth(self, pRoot):
        cur = [pRoot]  
        depth = 0                                                # 接下来要循环的当前层节点,存的是节点
        while cur:                                                  # 当前层存在结点时                           
            next_layer_node = []                                    # 初始化下一层结点列表为空
            for node in cur:                                        # 遍历当前层的每一个结点
                if node:                                            # 如果该结点不为空,则进行记录
                    next_layer_node.extend([node.left, node.right]) # 将该结点的左右孩子结点加入到下一层结点列表                   # 则把当前层结果列表插入到队列首端
            cur = next_layer_node 
            depth += 1 # 下一层的结点变成当前层,接着循环
        return   (depth-1)

通过后序遍历得到树的深度了。通过递归的方法,走到深度,然后不断的返回,为了避免平行,选择最深的就是这个棵树的深度了。

class Solution:
    def TreeDepth(self, pRoot):
        # write code here
        if pRoot == None:
            return 0
        nLeft = self.TreeDepth(pRoot.left)    #往里面走走到底部
        nRight = self.TreeDepth(pRoot.right)    #往里面走走到底部
        return max(nLeft+1,nRight+1)#(nLeft+1 if nLeft > nRight else nRight +1)  #走到底部以后开始返回,返回最深的,就是树的深度。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值