"""
This script concerns tree structure and its kinds of traversal: inorder, preorder, postorder and level order
"""
class Node():
def __init__(self, x=-1):
self.val = x
self.left = None
self.right = None
class Tree():
def __init__(self):
self.root = Node()
self.myqueue = []
def add(self, x):
node = Node(x)
if self.root.val == -1:
self.root = node
self.myqueue.append(self.root)
else:
treeNode = self.myqueue[0]
if treeNode.left == None:
treeNode.left = node
self.myqueue.append(treeNode.left)
else:
treeNode.right = node
self.myqueue.append(treeNode.right)
self.myqueue.pop(0)
def preorder(self, root):
if root == None:
return
print(root.val)
self.preorder(root.left)
self.preorder(root.right)
def inorder(self, root):
if root == None:
return
self.inorder(root.left)
print(root.val)
self.inorder(root.right)
def postorder(self, root):
if root == None:
return
self.postorder(root.left)
self.postorder(root.right)
print(root.val)
def preorder1(self, root):
if not root:
return
node = root
mystack = []
while len(mystack) or node:
while node:
print(node.val)
mystack.append(node)
node = node.left
node = mystack.pop()
node = node.right
def inorder1(self, root):
if not root:
return
node = root
mystack = []
while len(mystack) or node:
while node:
mystack.append(node)
node = node.left
node = mystack.pop()
print(node.val)
node = node.right
def postorder1(self, root):
if not root:
return
node = root
mystack1 = [node]
mystack2 = []
while len(mystack1):
node = mystack1.pop()
if node.left:
mystack1.append(node.left) # 这个while循环的功能是找出后序遍历的逆序,存在myStack2里面
if node.right:
mystack1.append(node.right)
mystack2.append(node)
while mystack2: # 将myStack2中的元素出栈,即为后序遍历次序
print(mystack2.pop().val)
def level_order(self, root):
if not root:
return
node = root
myqueue = [node]
while len(myqueue):
node = myqueue.pop(0)
print(node.val)
if node.left:
myqueue.append(node.left)
if node.right:
myqueue.append(node.right)
def z_order(self, root):
if not root:
return
res, odd, even = [], [], []
odd.append(root)
while odd or even:
row = [] # 用来存储每行的值
while odd:
tmp = odd.pop()
row.append(tmp.val)
if tmp.left:
even.append(tmp.left)
if tmp.right:
even.append(tmp.right)
if row:
res.append(row)
row = []
while even:
tmp = even.pop()
row.append(tmp.val)
if tmp.right:
odd.append(tmp.right)
if tmp.left:
odd.append(tmp.left)
if row:
res.append(row)
return res
if __name__ == '__main__':
seq = range(10)
tree = Tree()
for i in seq:
tree.add(i)
# print(tree)
# print('preorder')
# tree.preorder(tree.root)
# tree.preorder1(tree.root)
# print('inorder\n')
# tree.inorder(tree.root)
# tree.inorder1(tree.root)
# print('postorder\n')
# tree.postorder(tree.root)
# tree.postorder1(tree.root)
print('level:\n')
tree.level_order(tree.root)
print('zorder:\n')
print(tree.z_order(tree.root))