基于Python的二叉树遍历算法

来源:互联网 发布:微信恶搞软件 编辑:程序博客网 时间:2024/06/07 05:46

   今天用Python把二叉树的三种遍历都实现了一遍,用作学习Python的练手程序:

<span style="font-size:14px;">#/usr/bin/python#coding: utf-8from collections import deque#二叉树的节点结构class Node():    def __init__(self,data=None,left=None,right=None):        self.data=data        self.left=left        self.right=rightdef create_tree(root):    a=raw_input('please input a data:')    if a=='#':        root=None    else:        root=Node(data=a)        print "请输入%s的左孩子:" % root.data        root.left=create_tree(root.left)        print "请输入%s的右孩子:" % root.data        root.right=create_tree(root.right)    return root#递归前序遍历def preorder(root):         if root==None:        return    else:        print root.data        inorder(root.left)        inorder(root.right)#非递归先序遍历def preorder_non(root):    q=deque([])    q.append(root)    while q:        tem=q.pop()        print tem.data        if tem.right!= None:            q.append(tem.right)        if tem.left!= None:            q.append(tem.left)#递归中序遍历def inorder(root):    if root is None:        return    else:        inorder(root.left)        print root.data        inorder(root.right)#非递归中序遍历def inorder_non(root):    q=deque([])    q.append(root)    while q:        while root!=None and root.left!=None:            q.append(root.left)            root=root.left        tem=q.pop()        print tem.data        if tem.right!=None:            q.append(tem.right)        root=tem.right#递归后序遍历def postorder(root):    if root is None:        return     else:        postorder(root.left)        postorder(root.right)        print root.data#非递归后序遍历def postorder_non(root):    q1=deque([])    q2=deque([])    result=[]    q1.append(root)    while q1:        tem=q1.pop()        q2.append(tem)        if tem.left!=None:            q1.append(tem.left)        if tem.right!=None:            q1.append(tem.right)    while q2:        top=q2.pop()        #print top.data        result.append(top.data)    print resultif __name__ =="__main__":    root=None    print "创建二叉栿"    root=create_tree(root)    print "递归先序遍历"    preorder(root)    print "非递归先序遍历"    preorder_non(root)    print "递归中序遍历"    inorder(root)    print "非递归中序遍历"    inorder_non(root)    print "递归后序遍历"    postorder(root)    print "非递归后序遍历"    postorder_non(root)</span>


0 0