算法——二叉树前序遍历、中序遍历、后序遍历、层序遍历、二叉树恢复

前序、中序、后序的区别是:根节点的位置,根节点在前,那就是前序,根节点在中,那就是中序,根节点在后,那就是后序。
层序遍历:二叉树一层一层的进行遍历。

前序遍历

具体过程如下:
先访问根节点,再访问左右节点,如果左节点是下面还有的话,那就再访问左节点的左节点,再访问左节点下的右节点。以此类推。
代码如下:

class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        ans = []
        def dfs(node):
            if node is None:
                return 
            ans.append(node.val)  #  先访问根节点
            dfs(node.left)  # 再访问左节点
            dfs(node.right)  # 再访问右侧节点
        dfs(root)
        return ans
  

中序遍历

中序遍历的话,那就先访问左节点,再访问根节点,再访问右侧节点(将根节点放置在中间。)

class Solution:
  def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
      ans = []
      def dfs(node):
          if node is None:
              return 
          dfs(node.left) #先访问左节点
          ans.append(node.val) #再访问根节点
          dfs(node.right) # 再访问右侧节点
      dfs(root)
      return ans

后序遍历

后序遍历先左节点,再右侧节点,再根节点(将根节点放置在最后进行访问)

class Solution:
   def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
       ans = []
       def dfs(node):
           if node is None:
               return 
           dfs(node.left) # 先左节点
           dfs(node.right) # 再右侧节点
           ans.append(node.val) # 最后根节点
       dfs(root)
       return ans

层序遍历

一层一层的进行遍历了

class Solution:
   def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
       ans = [] 
       stack = [root] if root else [] # 保存根节点
       while stack:
           nex = [] # 临时存放中间节点
           ans.append([node.val for node in stack]) #输出根节点的值
           for node in stack:  # 依次访问根节点的左右
               if node.left:
                   nex.append(node.left)  #将中间节点临时存放起来,
               if node.right:
                   nex.append(node.right)
           stack = nex  将中间结果视为根节点,重新再来
       return ans

N叉树的层序遍历

原题链接

class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        if not root:
            return []
        res=[]
        q=[root]
        while q:
            res.append([i.val for i in q])
            for i in range(len(q)):
                node=q.pop(0)
                for j in node.children:
                    q.append(j)
        return res

猜你喜欢

转载自blog.csdn.net/weixin_49321128/article/details/126674282