python 二叉树遍历

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon May 13 15:48:30 2019

@author: lg
"""

class Node():
    #节点类
    def __init__(self,data = -1):
        self.data = data
        self.left = None
        self.right = None
class Tree():
    #树类
    def __init__(self):
        self.root = Node()
 
    def add(self,data):
        # 为树加入节点
        node  = Node(data)
        if self.root.data == -1:        #如果树为空,就对根节点赋值
            self.root = node
        else:
            myQueue = []
            treeNode = self.root
            myQueue.append(treeNode)
            while myQueue:              #对已有的节点进行层次遍历
                treeNode = myQueue.pop(0)
                if not treeNode.left:
                    treeNode.left = node
                    return
                elif not treeNode.right:
                    treeNode.right = node
                    return
                else:
                    myQueue.append(treeNode.left)
                    myQueue.append(treeNode.right)
 
    def pre_order_recursion(self,root):     #递归实现前序遍历
        if not root:
            return
        print( root.data,)
        self.pre_order_recursion(root.left)
        self.pre_order_recursion(root.right)
 
    def pre_order_stack(self,root):         #堆栈实现前序遍历(非递归)
        if not root:
            return
        myStack = []
        node = root
        while myStack or node:
            while node:       #从根节点开始,一直寻找他的左子树
                print (node.data,)
                myStack.append(node)
                node = node.left
            node = myStack.pop()    #while结束表示当前节点node为空,即前一个节点没有左子树了
            node = node.right       #开始查看它的右子树
 
    def in_order_recursion(self,root):      #递归实现中序遍历
        if not root:
            return
        self.in_order_recursion(root.left)
        print( root.data,)
        self.in_order_recursion(root.right)
 
    def in_order_stack(self,root):        #堆栈实现中序遍历(非递归)
        if not root:
            return
        myStack = []
        node = root
        while myStack or node:     #从根节点开始,一直寻找它的左子树
            while node:
                myStack.append(node)
                node = node.left
            node = myStack.pop()
            print(node.data,)
            node = node.right
 
 
    def post_order_recursion(self,root):     #递归实现后序遍历
        if not root:
            return
        self.post_order_recursion(root.left)
        self.post_order_recursion(root.right)
        print( root.data,)
        
    def post_order_stack(self, root):  # 堆栈实现后序遍历(非递归)
        # 先遍历根节点,再遍历右子树,最后是左子树,这样就可以转化为和先序遍历一个类型了,最后只把遍历结果逆序输出就OK了。
        if not root:
            return
        myStack1 = []
        myStack2 = []
        node = root
        while myStack1 or node:
            while node:
                myStack2.append(node)
                myStack1.append(node)
                node = node.right
            node = myStack1.pop()
            node = node.left
        while myStack2:
            print( myStack2.pop().data,)
 
    def level_order_queue(self,root):       #队列实现层次遍历(非递归)
        if not root :
            return
        myQueue = []
        node = root
        myQueue.append(node)
        while myQueue:
            node = myQueue.pop(0)
            print( node.data,)
            if node.left:
                myQueue.append(node.left)
            if node.right:
                myQueue.append(node.right)
                
if __name__ == '__main__':
    #主函数
    datas = [2,3,4,5,6,7,8,9]
    tree = Tree()          #新建一个树对象
    for data in datas:
        tree.add(data)      #逐个加入树的节点
 
    print ('递归实现前序遍历:')
    tree.pre_order_recursion(tree.root)
 
    print( '\n堆栈实现前序遍历')
    tree.pre_order_stack(tree.root)
 
    print ("\n\n递归实现中序遍历:")
    tree.in_order_recursion(tree.root)
 
    print ("\n堆栈实现中序遍历:")
    tree.in_order_stack(tree.root)
 
    print ('\n\n递归实现后序遍历:')
    tree.post_order_recursion(tree.root)
 
    print('\n堆栈实现后序遍历:')
    tree.post_order_stack(tree.root)
 
    print('\n\n队列实现层次遍历:')
    tree.level_order_queue(tree.root)
posted @   luoganttcc  阅读(4)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示