非递归遍历二叉树

#类名称:BinaryTreeNode
#类说明:定义一个二叉树的结点
#类释义:分别有左孩子LeftChild,右孩子RightChild和数据data
class BinaryTreeNode(object):
    def __init__(self):
        self.data='#'
        self.LeftChild=None
        self.RightChild=None

class TreeState(object):
    def __init__(self,BinaryTreeNode,VisitedFlag):
        self.BinaryTreeNode = BinaryTreeNode
        self.VisitedFlag = VisitedFlag

#类说明:定义一个二叉树
class BinaryTreeNonRecursive(BinaryTreeNode):
    #创建二叉树的函数
    def CreateBinaryTree(self,Root):
        data=input('->')
        if data=='#':
            Root=None
        else:
            Root.data=data
            Root.LeftChild=BinaryTreeNode()
            self.CreateBinaryTree(Root.LeftChild)
            Root.RightChild=BinaryTreeNode()
            self.CreateBinaryTree(Root.RightChild)

    #先序遍历非递归算法
    def PreOrderNonRecursive(self,Root):
        StackTreeNode=[]
        tTreeNode=Root
        while len(StackTreeNode)>0 or tTreeNode is not None:
            while tTreeNode is not None:
                self.VisitBinaryTreeNode(tTreeNode)
                StackTreeNode.append(tTreeNode)
                tTreeNode=tTreeNode.LeftChild
            if len(StackTreeNode)>0:
                tTreeNode=StackTreeNode.pop()
                tTreeNode=tTreeNode.RightChild

    #中序遍历非递归算法
    def InOrderNonRecursive(self, Root):
        StackTreeNode = []
        tTreeNode = Root
        while len(StackTreeNode)>0 or tTreeNode is not None:
            while tTreeNode is not None:
                StackTreeNode.append(tTreeNode)
                tTreeNode = tTreeNode.LeftChild
            if len(StackTreeNode)>0:
                tTreeNode = StackTreeNode.pop()
                self.VisitBinaryTreeNode(tTreeNode)
                tTreeNode = tTreeNode.RightChild    

    #后序遍历的非递归算法
    def PostOrderNonRecursive(self,Root):
        StackTreeNode = []
        tBinaryTreeNode = Root
        tTree = None
        while tBinaryTreeNode is not None:
            tTree = TreeState(tBinaryTreeNode,0)
            StackTreeNode.append(tTree)
            tBinaryTreeNode = tBinaryTreeNode.LeftChild
        while len(StackTreeNode)>0:
            tTree = StackTreeNode.pop()
            if tTree.BinaryTreeNode.RightChild is None or tTree.VisitedFlag == 1:
                self.VisitBinaryTreeNode(tTree.BinaryTreeNode)
            else:
                StackTreeNode.append(tTree)
                tTree.VisitedFlag = 1
                tBinaryTreeNode=tTree.BinaryTreeNode.RightChild
                while tBinaryTreeNode is not None:
                    tTree = TreeState(tBinaryTreeNode,0)
                    StackTreeNode.append(tTree)
                    tBinaryTreeNode = tBinaryTreeNode.LeftChild
    
    #遍历二叉树的一个结点函数
    def VisitBinaryTreeNode(self, BinaryTreeNode):
        #值为#的结点代表空结点
        if BinaryTreeNode.data is not '#':
            print (BinaryTreeNode.data)

#主程序 
btnrn = BinaryTreeNode()
btrn = BinaryTreeNonRecursive()
print ('创建一棵二叉树\n')
print ('         4')
print ('        / \\')
print ('       5   6')
print ('      / \\  \\')
print ('     1   2  7 ')
print ('4 5 1 # # 2 # # 6 # 7 # #')
#创建一棵二叉树
print('请仿照上述序列,输入某一二叉树中各结点的值(#表示空结点),每输入一个值按回车换行:')
btrn.CreateBinaryTree(btnrn)
#非递归遍历二叉树
print ('对二叉树进行非递归前序遍历:\n')
#前序遍历二叉树
btrn.PreOrderNonRecursive(btnrn)
print ('对二叉树进行非递归中序遍历:\n')
#中序遍历二叉树
btrn.InOrderNonRecursive(btnrn)
print ('对二叉树进行非递归后序遍历:\n')
#后序遍历二叉树
btrn.PostOrderNonRecursive(btnrn)  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值