Python实现前、中、后、层序遍历

二叉树前中后序遍历

在这里插入图片描述
如图所示二叉树:
前序遍历:5 3 1 4 8 6 9(先根后子,子先左再右)
中序遍历:1 3 4 5 6 8 9(从左往右)
后序遍历:1 4 3 6 9 8 5(先子后根,子先左再右)
层序遍历:5 3 8 1 4 6 9(从上到下,从左到右)

前序遍历

class BstNode:
    """二叉树节点"""
    __slots__ = ('_item', '_left', '_right')#固定集合的属性分配空间,省内存

    def __init__(self, item, left=None, right=None):
        self._item = item
        self._left = left
        self._right = right
class BST:
	#递归实现
	def print_preOrder(self):
	   print("前序遍历的递归实现:", end="")#这个打印只是为了文字标注打印出来的内容是归属什么遍历,可忽略
	   self.__print_preOrder(self._root)
	   print()#这个打印只是为了隔开一行,方便观看,和实际代码无关系
	
	def __print_preOrder(self, node):
	   if node is None:
	       return None
	   print('[', node._item, ']', end=" ")#打印放在最前
	   self.__print_preOrder(node._left)
	   self.__print_preOrder(node._right)
	
	
	#迭代实现
	def print_preOrder_iteration(self):
	       """借助栈来实现,每次先把当前节点放入栈,弹出去并记录该值,
	       把弹出去节点的左右节点加进去,弹出左边节点,一直往下……
	       (这样子会从根优先遍历到左边子树底部,由于每次都是左右节点加进去先弹左边,
	       故当左边弹完,会弹同一级的右边,这样子就实现了先序遍历)"""
	       if not self._root:
	           return
	       self.stack = [self._root]
	       print("先序遍历的迭代实现:", end="")
	       while self.stack:
	           temp_node = self.stack.pop()
	           if temp_node:
	               print('[', temp_node._item, ']', end=" ")#把当前节点值打印
	               #先把右边入栈,这样子利用后进先出左边节点值
	               self.stack.append(temp_node._right)
	               self.stack.append(temp_node._left)
#输出
前序遍历的递归实现:[ 5 ] [ 3 ] [ 1 ] [ 4 ] [ 8 ] [ 6 ] [ 9 ]
先序遍历的迭代实现:[ 5 ] [ 3 ] [ 1 ] [ 4 ] [ 8 ] [ 6 ] [ 9 ]

中序遍历

class BstNode:
    """二叉树节点"""
    __slots__ = ('_item', '_left', '_right')#固定集合的属性分配空间,省内存

    def __init__(self, item, left=None, right=None):
        self._item = item
        self._left = left
        self._right = right
class BST:
    """二叉树"""
    #省略初始化定义……
 	#递归实现
    def print_midOrder(self):
        print("中序遍历的递归实现:", end="")
        self.__print_midOrder(self._root)
        print()

    def __print_midOrder(self, node):
        if node is None:
            return None
        self.__print_midOrder(node._left)
        print('[', node._item, ']', end=" ")#打印放在中间
        self.__print_midOrder(node._right)
        
    #递归另一种实现方式
    def mid_print(self):
        return self.mid_print_helper(self._root)

    def mid_print_helper(self, root):
        return self.mid_print_helper(root._left) + [root._item] + self.mid_print_helper(root._right) if root else []
        
    #迭代实现    
	def print_midOrder_iteration(self):
        """借助栈来实现"""
        if not self._root:
            return
        
        node = self._root
        self.stack = []
        print("中序遍历的迭代实现:", end="")
                
        while self.stack or node:#这里要加上or node是为了触发进去循环
            while node:#当前节点只要左边还存在,则一直加到栈里面
                self.stack.append(node) 
                node = node._left
            temp_node = self.stack.pop()
            print('[', temp_node._item, ']', end=" ")#把当前节点值打印
            if temp_node._right:#当该节点存在右子树时
                node = temp_node._right   

bst = BST()
bst.add(5)#add请自行实现
bst.add(3)
bst.add(8)
bst.add(1)
bst.add(4)
bst.add(6)
bst.add(9)
#以上add完,实现同上图所示树
bst.print_midOrder()
bst.print_midOrder_iteration()
#输出
中序遍历的递归实现:[ 1 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 8 ] [ 9 ]
中序遍历的迭代实现:[ 1 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 8 ] [ 9 ]

后序遍历

class BstNode:
    """二叉树节点"""
    __slots__ = ('_item', '_left', '_right')#固定集合的属性分配空间,省内存

    def __init__(self, item, left=None, right=None):
        self._item = item
        self._left = left
        self._right = right
class BST:
	#递归实现
	def print_postOrder(self):
        print("后序遍历的递归实现:", end="")
        self.__print_postOrder(self._root)
        print()  

    def __print_postOrder(self, node):
        if node is None:
            return None
        self.__print_postOrder(node._left)
        self.__print_postOrder(node._right)
        print('[', node._item, ']', end=" ")
	
	#迭代实现
	def print_postOrder_iteration(self):
        """借助栈来实现"""
        if not self._root:
            return
        self.stack = [self._root]
        res = []
        print("后序遍历的迭代实现:")    
        while self.stack:
            temp = self.stack.pop()
            res.append(temp._item)
            if temp._left:
                self.stack.append(temp._left)
            if temp._right:
                self.stack.append(temp._right)
        print(res[::-1])
#输出
后序遍历的递归实现:[ 1 ] [ 4 ] [ 3 ] [ 6 ] [ 9 ] [ 8 ] [ 5 ]
后序遍历的迭代实现:
[1, 4, 3, 6, 9, 8, 5]

层序遍历

class BstNode:
    """二叉树节点"""
    __slots__ = ('_item', '_left', '_right')#固定集合的属性分配空间,省内存

    def __init__(self, item, left=None, right=None):
        self._item = item
        self._left = left
        self._right = right
class BST:
	#递归实现
	def levelOrder(self):
        if self._root is None: return None
        print("中序遍历的迭代实现:", end="")
        print('[', self._root._item, ']', end=" ")
        self.levelOrder_helper(self._root)

    def levelOrder_helper(self, node):
        if node is None:
            return None

        if node._left:
            print('[', node._left._item, ']', end=" ")
        if node._right:
            print('[', node._right._item, ']', end=" ")

        self.levelOrder_helper(node._left)
        self.levelOrder_helper(node._right)

	#层序遍历(迭代)     
    def levelOrder_iteration(self):
        print("层序遍历的迭代实现:", end="")
        root = self._root
        #迭代实现
        """层序遍历迭代实现"""
        if root is None: return []
        stack = [[root]]#中转使用的栈
        res = []#存储结果

        while stack:#只要栈还存在值
            temp = stack.pop()
            
            for item in temp:
                res.append(item._item)

            #栈由于后进先出,所以要先入右子树再左子树
            tempnode_lst = []
            for item in temp:
                if item._left:
                    tempnode_lst.append(item._left)
                if item._right:
                    tempnode_lst.append(item._right)
            if tempnode_lst:
                stack.append(tempnode_lst)
        print(res)
#输出
层序遍历的递归实现:[ 5 ] [ 3 ] [ 8 ] [ 1 ] [ 4 ] [ 6 ] [ 9 ]
层序遍历的迭代实现:[5, 3, 8, 1, 4, 6, 9]
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是二叉树层序遍历Python实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def levelOrder(root): """ :type root: TreeNode :rtype: List[List[int]] """ # 如果根节点为空,则返回空列表 if not root: return [] # 初始化结果列表和队列,将根节点加入队列 result = [] queue = [root] # 循环遍历队列,直到队列为空 while queue: # 获取当队列的长度,即当层的节点个数 level_len = len(queue) level_vals = [] # 遍历层的所有节点 for i in range(level_len): # 弹出队列的节点,并将其值添加到当层的值列表 node = queue.pop(0) level_vals.append(node.val) # 如果当节点有左子节点,则将其加入队列 if node.left: queue.append(node.left) # 如果当节点有右子节点,则将其加入队列 if node.right: queue.append(node.right) # 将当层的值列表添加到结果列表 result.append(level_vals) # 返回结果列表 return result ``` 在上述实现,我们使用了一个队列来存储遍历过程的节点。我们首先将根节点加入队列,然后循环遍历队列,每次弹出队列的一个节点,并将其左右子节点加入队列。我们还需要记录当层的节点个数,以便在遍历完当层时,能够开始遍历下一层。在遍历完所有层后,我们将所有层的值列表添加到结果列表,最终返回结果列表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值