二叉树创建及递归和非递归代码如下:
stack = []
stack1 = []
class TreeNode(object):
def __init__(self, data = 0,left = 0, right = 0):
self.data = data
self.left = left
self.right = right
class Tree(object):
def __init__(self, root = 0):
self.root = root
def Isempty(self):
if self.root == 0:
return True
return False
def preOrder(self, treenode):
if treenode == 0:
return
print(treenode.data)
self.preOrder(treenode.left)
self.preOrder(treenode.right)
def InOrder(self, treenode):
if treenode == 0:
return
self.InOrder( treenode.left)
print(treenode.data)
self.InOrder(treenode.right)
def PostOrder(self, treenode):
if treenode == 0:
return
self.PostOrder(treenode.left)
self.PostOrder(treenode.right)
print(treenode.data)
def preOrderWithStack(self, treenode):
if treenode is 0:
print('the tree is null can not show!')
return
p = treenode
print('*******************', len(stack))
while len(stack) != 0 or p != 0:
while p != 0:
print(p.data)
stack.append(p)
p = p.left
node = stack.pop()
p = node.right
def InOrderWithStack(self, treenode):
if treenode is 0:
print('the tree is null can not show!')
return
p = treenode
print('*******************', len(stack))
while len(stack) != 0 or p != 0:
while p != 0:
stack.append(p)
p = p.left
node = stack.pop()
print(node.data)
p = node.right
def PostOrderWithStack(self, treenode):
if treenode is 0:
print('the tree is null can not show!')
return
p = treenode
print('*******************', len(stack))
while len(stack) != 0 or p != 0:
while p != 0:
stack.append(p)
stack1.append(p)
p = p.right
node = stack.pop()
p = node.left
stack1.reverse()
for node in (stack1):
print(node.data)
#测试用例1测试出后序遍历有问题
n1 = TreeNode(1, 0, 0)
n4 = TreeNode(4, 0, 0)
n3 = TreeNode(3, n4, 0)
root = TreeNode(2, n1, n3)
tree = Tree(root)
'''
d = TreeNode('d', 0 , 0)#创建叶子节点
e = TreeNode('e', 0, 0)
b = TreeNode('b', d, e)#创建父节点
f = TreeNode('f', 0, 0)
c = TreeNode('c', f, 0)
a = TreeNode('a', b, c)#创建根节点
tree = Tree(a)
#测试用例3测试出前序遍历有问题
n4 = TreeNode(4, 0, 0)
n1 = TreeNode(1, 0, n4)
n3 = TreeNode(3, 0, 0)
root = TreeNode(2, n1, n3)
tree = Tree(root)
'''
print(tree.Isempty())
print("前序遍历:")
tree.preOrder(tree.root)
print("非递归前序遍历:")
tree.preOrderWithStack(tree.root)
print("中序遍历:")
tree.InOrder(tree.root)
print("非递归中序遍历:")
tree.InOrderWithStack(tree.root)
print("后序遍历:")
tree.PostOrder(tree.root)
print("非递归后序遍历:")
tree.PostOrderWithStack(tree.root)
运行结果如下:
C:\Users\snowshuang\AppData\Local\Programs\Python\Python37\python.exe C:/Users/snowshuang/PycharmProjects/logging/log1.py
False
前序遍历:
2
1
3
4
非递归前序遍历:
******************* 0
2
1
3
4
中序遍历:
1
2
4
3
非递归中序遍历:
******************* 0
1
2
4
3
后序遍历:
1
4
3
2
非递归后序遍历:
******************* 0
1
4
3
2
Process finished with exit code 0
非递归采用堆栈遍历,python比c语言好的地方是python的list原生支持堆栈,省去了搭建堆栈的代码。比c语言还简单!