美文网首页
55二叉树高度,剑指offer,递归(执行图)和层序遍历,

55二叉树高度,剑指offer,递归(执行图)和层序遍历,

作者: shishi11 | 来源:发表于2020-12-08 08:37 被阅读0次
    在这里插入图片描述

    方法一 深度优先遍历 递归(栈)

    # 遍历二叉树有两种 深度优先遍历   层序优先遍历
    
    # 递归的实现调用自身的函数 都在缓存中,还没有执行  直到递归截至条件,从最后的函数进行执行
    # 先进后出 就是栈的一个规律,进行执行的, 进就是调用函数本身 ,出就是递归截止条件后,执行之前的函数功能
    # 左子树 深度   右子树深度   ,最大值  +1
    
    # 递归的顺序方向  是入栈 ,开辟了缓存空间, 是多个 调用函数本身(空间换时间的方法)
    # 递归的逆向就是执行 出栈, 从递归的截止条件(初始位置) 开始向上执行(
    # 调用函数(调用的是自己) 
    
    # .理解递归的时候不能一直往深处考虑,那样不适合人类的思维,只需要思考最后该退出时要返回什么,一般的情况下该返回什么,写代码时明确了这两个即可  (递归截止条件和 递归执行条件)
    class Solution:
        def maxDepth(self, root: TreeNode) -> int:
            if not root: 
                return 0  #递归到底的情况需要写出来,这里也是初始化条件, 程序从这里向上执行
            else:
                return max(self.maxDepth(root.left),self.maxDepth(root.right))+1  
                
    

    如下树的执行过程

    框的位置  相当于递归的顺序执行 是 入栈操作
    蓝色 是出栈运行, 递归截止 条件处 ( 同时也是程序初始执行结果) 开始执行 ,往上调用  
    最后返回树的高度 3
    
    在这里插入图片描述
    在这里插入图片描述

    方法2 层序遍历 队列

    实际也不算是 队列, 就是 变量的循环更新 操作
    记录一层所有的节点 queue , while 不是空就 累加一层

    # 层序遍历通常用  队列
    # 深度优先遍历  栈(递归) 操作 
    
    class Solution:
        def maxDepth(self, root: TreeNode) -> int:
                if not root :
                    return 0  #空 数的深度0
                queue=[root]
                res = 0
                # queue 每次存储的是 每一层所有的节点, 也就是上一层节点的所有 左右子节点
                # 变化 [3]  [9,20]    [15,7]   [最后是空的]
                #外层循环是 层数   内层循环是 每一层的节点遍历
                while queue:  #队列这里是动态变化的,空,跳出循环
    
                    res = res+1  #res 是跟着 外层循环while走的, 
    
                    # queue 每次变化 是每一层的节点, 直到 为空结束
                    tmp = []  #用来临时储存  当前层 的 下一层所有节点
                    for node in queue:#每个节点都要有,因为可能一层当中 都是上一层的左节点或者右节点
                        if node.left : tmp.append(node.left)
                        if node.right : tmp.append(node.right)
                    
                    queue = tmp
                return  res
                    
    # 参考         
    # 作者:jyd
    # 链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/solution/mian-shi-ti-55-i-er-cha-shu-de-shen-du-xian-xu-bia/
    # 来源:力扣(LeetCode)
    # 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    这里可能有个疑问 queue = [root] 初始化怎么是3不是所有节点昵

    打印一下这里的queue
    [TreeNode{val: 3, left: TreeNode{val: 9, left: None, right: None}, right: TreeNode{val: 20, left: TreeNode{val: 15, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}}]

    就是所有节点,树的结构
    queue 实际更新的是 当前层 以及以下的所有层的节点
    节点是一层层减少的 直到最后 得到所有的空节点,没有层了

    相关文章

      网友评论

          本文标题:55二叉树高度,剑指offer,递归(执行图)和层序遍历,

          本文链接:https://www.haomeiwen.com/subject/rzxfgktx.html