今天用Python把二叉树的三种遍历都实现了一遍,用作学习Python的练手程序:
<span style="font-size:14px;">#/usr/bin/python
#coding: utf-8
from collections import deque
#二叉树的节点结构
class Node():
def __init__(self,data=None,left=None,right=None):
self.data=data
self.left=left
self.right=right
def 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 result
if __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>