# -*- coding: utf-8 -*-
"""
Created on Mon Sep 18 01:49:41 2017
@author: Shawn Yuen
"""
# a helper function
def flatten(ll):
if isinstance(ll, list):
for i in ll:
for element in flatten(i):
yield element
else:
yield ll
# Node Class: left and right, also middel
class Node(object):
def __init__(self, elem=-1, lchild=None, rchild=None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
# Binary Tree Class
class Tree(object):
def __init__(self):
self.root = Node()
self.myQueue = []
# Add a Node for a Tree
def add(self, elem):
node = Node(elem)
if self.root.elem == -1:
self.root = node
self.myQueue.append(self.root)
else:
treeNode = self.myQueue[0]
if treeNode.lchild == None:
treeNode.lchild = node
self.myQueue.append(treeNode.lchild)
else:
treeNode.rchild = node
self.myQueue.append(treeNode.rchild)
self.myQueue.pop(0)
def preorder_recursion(self, root):
ArrayList = list()
#preoder traversal using recursion
if root == None:
return
#print(root.elem)
ArrayList.append(root.elem)
if root.lchild != None:
ArrayList.append(self.preorder_recursion(root.lchild))
if root.rchild != None:
ArrayList.append(self.preorder_recursion(root.rchild))
return ArrayList
def inorder_recursion(self, root):
ArrayList = list()
#inorder traversal
if root == None:
return
if root.lchild != None:
ArrayList.append(self.inorder_recursion(root.lchild))
#print(root.elem)
if root.elem != None:
ArrayList.append(root.elem)
if root.rchild != None:
ArrayList.append(self.inorder_recursion(root.rchild))
return ArrayList
def postorder_recursion(self, root):
ArrayList = list()
#postorder traversal
if root == None:
return
if root.lchild != None:
ArrayList.append(self.postorder_recursion(root.lchild))
if root.rchild != None:
ArrayList.append(self.postorder_recursion(root.rchild))
if root.elem != None:
#print(root.elem)
ArrayList.append(root.elem)
return ArrayList
def preorder_stack(self, root):
ArrayList = list()
if root == None:
return
myStack = []
node = root
while node or myStack:
while node:
#print(node.elem)
ArrayList.append(node.elem)
myStack.append(node)
node = node.lchild
node = myStack.pop()
node = node.rchild
return ArrayList
def inorder_stack(self, root):
ArrayList = list()
if root == None:
return
myStack = []
node = root
while node or myStack:
while node:
myStack.append(node)
node = node.lchild
node = myStack.pop()
#print(node.elem)
ArrayList.append(node.elem)
node = node.rchild
return ArrayList
def postorder_stack(self, root):
ArrayList = list()
if root == None:
return
myStack1 = []
myStack2 = []
node = root
myStack1.append(node)
while myStack1:
node = myStack1.pop()
if node.lchild:
myStack1.append(node.lchild)
if node.rchild:
myStack1.append(node.rchild)
myStack2.append(node)
while myStack2:
#print(myStack2.pop().elem)
ArrayList.append(myStack2.pop().elem)
return ArrayList
def levelorder_queue(self, root):
ArrayList = list()
if root == None:
return
myQueue = []
node = root
myQueue.append(node)
while myQueue:
node = myQueue.pop(0)
#print(node.elem)
ArrayList.append(node.elem)
if node.lchild != None:
myQueue.append(node.lchild)
if node.rchild != None:
myQueue.append(node.rchild)
return ArrayList
if __name__ == "__main__":
# please modify this parameter
###
N = 15 # the number of Node in a Tree
###
elems = range(N)
tree = Tree() # new/create a Tree
for elem in elems:
tree.add(elem) # add Node into Tree
print("Level-order Traversal using Queue:")
print(tree.levelorder_queue(tree.root))
print("\nPreorder Traversal using Recursion:")
flattenlist = flatten(tree.preorder_recursion(tree.root))
print(list(flattenlist))
print("\nInorder Traversal using Recursion:")
flattenlist = flatten(tree.inorder_recursion(tree.root))
print(list(flattenlist))
print("\nPostorder Traversal using Recursion:")
flattenlist = flatten(tree.postorder_recursion(tree.root))
print(list(flattenlist))
print("\nPreorder Traversal using Stack:")
print(tree.preorder_stack(tree.root))
print("\nInorder Traversal using Stack:")
print(tree.inorder_stack(tree.root))
print("\nPostorder Traversal using Stack:")
print(tree.postorder_stack(tree.root))
输出结果如下(大家可以改动主函数里面的N):
Level-order Traversal using Queue:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
Preorder Traversal using Recursion:
[0, 1, 3, 7, 8, 4, 9, 10, 2, 5, 11, 12, 6, 13, 14]
Inorder Traversal using Recursion:
[7, 3, 8, 1, 9, 4, 10, 0, 11, 5, 12, 2, 13, 6, 14]
Postorder Traversal using Recursion:
[7, 8, 3, 9, 10, 4, 1, 11, 12, 5, 13, 14, 6, 2, 0]
Preorder Traversal using Stack:
[0, 1, 3, 7, 8, 4, 9, 10, 2, 5, 11, 12, 6, 13, 14]
Inorder Traversal using Stack:
[7, 3, 8, 1, 9, 4, 10, 0, 11, 5, 12, 2, 13, 6, 14]
Postorder Traversal using Stack:
[7, 8, 3, 9, 10, 4, 1, 11, 12, 5, 13, 14, 6, 2, 0]