【LeetCode】关于二叉树哪些事

178 阅读3分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

    image.png

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 树中节点的数目在范围 [0, 100] 内
    • -100 <= Node.val <= 100

二、思路分析:

大伙有没有和学渣我一样,一看数据结构二叉树、链表、图,就头皮发麻。每次遇到关于二叉树的题目,总是束手无策,本期我们全面来搞懂二叉树哪些事。

  • 什么是二叉树

    • 是一种非线性的数据结构,二叉树是属于树的一种。
    • 二叉树需要满足两个条件:(1)本身是有序树 (2)树种包含的节点数不能超过2个,只有会出现0、1和2三种情况

    image.png

    • 二叉树具有三个特点
      • (1)在深度为i层的二叉树,最多有2^i-1结点。
      • (2)第i层,最多有2^(i-1)个结点
      • (3)叶子数n0等于度数为2的结点数加1,即n0 = n2 + 1

    image.png

    • 二叉树可以继续分类为:满二叉树和完全二叉树。
      • (1)满二叉树:除了叶子节点,其他的每个结点都2个结点
      • (2)完全二叉树:满足满二叉树,且最后一层的结点依次从左到右分布

    image.png

    • 二叉树存储结构分为:顺序存储和链式存储

    image.png

    • 二叉树结点定义数据结构

    image.png

  • 二叉树前序遍历

    • 二叉树前序遍历主要思路为:(1)访问根结点 (2)访问左子树 (3)访问右子树

    image.png

    • 二叉树前序遍历:递归方法

      class Solution(object):
          def preorderTraversal(self, root):
              """
              :type root: TreeNode
              :rtype: List[int]
              """
      
              def peer(root):
                  if not root:
                      return
                  res.append(root.val)
                  peer(root.left)
                  peer(root.right)
      
              res = []
              peer(root)
              return res
      
    • 二叉树前序遍历:迭代法

      • 使用列表stack模拟入栈,将二叉树结点临时存储起来
      • 按照根->左->右的思路,将结点TreeNode.val值存入res列表中
      class Solution(object):
          def preorderTraversal(self, root):
              """
              :type root: TreeNode
              :rtype: List[int]
              """
      
              if not root:
                  return []
      
              cur,res,stack = root,[],[]
      
              while stack or cur:
      
                  while cur:
                      res.append(cur.val)
                      stack.append(cur)
                      cur = cur.left
      
                  tmp = stack.pop()
                  cur = tmp.right
      
              return res
      
  • 二叉树中序遍历

    • 二叉树中序遍历思路:(1)访问左子树 (2)访问根结点 (3)访问右子树

    image.png

    • 二叉树中序遍历:递归方法

      class Solution(object):
          def inorderTraversal(self, root):
              """
              :type root: TreeNode
              :rtype: List[int]
              """
      
              def peer(root):
                  if not root:
                      return
                  peer(root.left)
                  res.append(root.val)
                  peer(root.right)
      
              res = []
              peer(root)
      
              return res
      
    • 二叉树中序遍历:迭代方法

      • 使用列表stack模拟入栈,将二叉树结点临时存储起来

      • 按照左->根->右的思路,将结点TreeNode.val值存入res列表中

        class Solution(object):
            def inorderTraversal(self, root):
                """
                :type root: TreeNode
                :rtype: List[int]
                :规律:左中右
                """
                if not root:
                    return  
      
                cur,res,stack = root,[],[]
      
                while stack or cur:
      
                    while cur:
                        stack.append(cur)
                        cur = cur.left
      
                    tmp = stack.pop()
                    res.append(tmp.val)
                    cur = tmp.right
      
                return res
      
  • 二叉树后序遍历

    • 二叉树后序遍历思路:(1)访问左子树 (2)访问右子树 (3)访问根结点

    image.png

    • 二叉树后序遍历:递归方法

      class Solution(object):
          def postorderTraversal(self, root):
              """
              :type root: TreeNode
              :rtype: List[int]
              """
      
              def peer(root):
      
                  if not root:
                      return
      
                  peer(root.left)
                  peer(root.right)
                  res.append(root.val)
      
              res = []
              peer(root)
      
              return res
      
    • 二叉树后序遍历:迭代方法

      • 使用列表stack模拟入栈,将二叉树结点临时存储起来
      • 按照左->右->根的思路,将结点TreeNode.val值存入res列表中
      class Solution(object):
          def postorderTraversal(self, root):
              """
              :type root: TreeNode
              :rtype: List[int]
              """
      
              if not root:return []
      
              cur,res,stack = root,[],[]
      
              while cur or stack:
                  while cur:
                      stack.append(cur)
                      if cur.left:
                          cur = cur.left
                      else:
                          cur = cur.right
      
                  tmp = stack.pop()
                  res.append(tmp.val)
      
                  if stack and stack[-1].left == tmp:
                      cur = stack[-1].right
                  else:
                      cur = None
      
              return res
      
  • 二叉树遍历解法模板:

    • 递归法:按照遍历思路,只需将递归函数里的 res.append(root.val) 放在不同位置即可

      def peer():
      
          root为空,返回
      
          递归左子树
          递归右子树
          将root的值添加res中
      
      
    • 迭代法:使用栈的思路。

       
       cur,stack,res= root,[],[]
       
       while cur or stack:
       
           while 循环:
           
              cur 向左下或者右下遍历
              cur 的值入栈
           弹出 tmp 结点
           cur 回到 tmp 左子树或者右子树
      
      返回结果
      
      

三、总结:

本期,我们对二叉树三种方式的遍历:前中后序,进行对比学习。遍历二叉树实现方法可以使用递归和迭代。

学习大佬们总结的模板,拿到关于二叉树的题目时,终于一点领悟了。不过,还是需要继续练习和理解的。

以上是本期内容,欢迎大佬们点赞评论,下期见~~

参考文档:二叉树四种解法