二叉树的迭代遍历一般迭代遍历 层序遍历

文章介绍了使用Python通过栈和队列实现二叉树的前序、后序、中序和层序遍历,包括递归和非递归两种方法。在遍历过程中,详细阐述了节点的入栈顺序以达到正确的遍历效果。

python

前序遍历 入栈顺序中右左

// A code block
var foo = 'bar';
class Solution:
   def preorderTraversal(self,root:TreeNode)->List[int]:
   if not root:
       return []
   stack = [root]
   result = []
   while stack:
      node = stack.pop()
      result.append(node.val)
      if node.right:
         stack.append(node.right)
      if node.left:
         stack.append(node.left)
  return result

后序遍历 入栈顺序 中左右

// A code block
var foo = 'bar';
class Solution:
   def preorderTraversal(self,root:TreeNode)->List[int]:
   if not root:
       return []
   stack = [root]
   result = []
   while stack:
      node = stack.pop()
      result.append(node.val)
      if node.left:
         stack.append(node.left)
      if node.right:
         stack.append(node.right)
  
  return result[::-1]

中序遍历 入栈顺序 左右

class Solution:
   def preorderTraversal(self,root:TreeNode)->List[int]:
   if not root:
       return []
   stack = []
   result = []
   cur = root
   while cur or stack:
          if cur:
             stack.append(cur)
             cur = cur.left
         else:
             cur=stack.pop()
             result.append(cur.val)
             cur=cur.right
  return result

层序遍历 一层一层打印

利用长度法

class Solution:
      def levelOrder(self,root:Optional[TreeNode])->List[List[int]]:
          if not root:
               return[]
           queue = collections.deque([root])
           result=[]
           while queue:
               level =[]
               for_in range(len(queue)):
                   cur=queue.popleft()
                   level.append(cur.val)
                   if cur.left:
                      queue.append(cur.left)
                   if cur.right:
                      queue.append(cur.right)
               result.append(level)
           return result

递归法

class Solution:
      def levelOrder(self,root:Optional[TreeNode])->List[List[int]]:
          levels=[]
          self.helper(root,0,levels)
          return levels
      def helper(self,node,level,levels):
          if not node:
              return
          if len(levels) == level:
              levels.append([])
          levels[level].append(node.val)
          self.helper(node.left,level+1,levels)
          self.helper(node.right,level+1,levels)

统一迭代法

前序遍历

class Solution:
     def preorderTraversal(self,root:TreeNode)->List[int]:
         result=[]
         st=[]
         if root:
             st.append(root)
         while st:
             node=st.pop()
             if node!=None:
                if node.right:  #右
                   st.append(node.right)
                if node.left:   #左
                   st.append(node.left)
                st.append(node) #中
                st.append(None)
             else:
                node=st.pop()
                result.append(node.val)
        return result
        

后序遍历:

class Solution:
     def postorderTraversal(self,root:TreeNode)->List[int]:
         result=[]
         st=[]
         if root:
             st.append(root)
         while st:
             node=st.pop()
             if node!=None:
                st.append(node) #中
                st.append(None)
                if node.right:  #右
                   st.append(node.right)
                if node.left:   #左
                   st.append(node.left)
              
             else:
                node=st.pop()
                result.append(node.val)
        return result
        

中序遍历

class Solution:
     def inorderTraversal(self,root:TreeNode)->List[int]:
         result=[]
         st=[]
         if root:
             st.append(root)
         while st:
             node=st.pop()
             if node!=None:
                if node.right:  #右
                   st.append(node.right)
                st.append(node) #中
                st.append(None)
                if node.left:   #左
                   st.append(node.left)  
             else:
                node=st.pop()
                result.append(node.val)
        return result
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖子小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值