二叉樹的非遞迴遍歷(python)
阿新 • • 發佈:2021-01-06
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
class TreeNode(object):
def __init__(self, val):
self.val = val
self.right = None
self.left = None
def set_children(self, left=None, right=None) :
self.left = left
self.right = right
class Tree(object):
def __init__(self, tree_node=None):
self.root = tree_node
def pre_order(self):
if self.root is None:
return []
order = []
stack = [self.root]
while len(stack) != 0:
temp_node = stack.pop()
order.append(temp_node.val)
if temp_node.right is not None:
stack.append(temp_node.right)
if temp_node.left is not None:
stack.append(temp_node.left)
return order
def middle_order(self) :
order = []
stack = []
temp_node = self.root
while temp_node is not None or len(stack) != 0:
if temp_node is not None:
stack.append(temp_node)
temp_node = temp_node.left
else:
temp_node = stack.pop()
order.append(temp_node.val)
temp_node = temp_node.right
return order
def after_order(self):
if self.root is None:
return []
order = []
stack = []
stack.append(self.root)
while len(stack) != 0:
temp_node = stack.pop()
order.append(temp_node.val)
if temp_node.left is not None:
stack.append(temp_node.left)
if temp_node.right is not None:
stack.append(temp_node.right)
order.reverse()
return order
def sequence_order(self):
if self.root is None:
return []
order = []
stack = []
stack.append(self.root)
while len(stack) != 0:
temp_node = stack.pop(0)
order.append(temp_node.val)
if temp_node.left is not None:
stack.append(temp_node.left)
if temp_node.right is not None:
stack.append(temp_node.right)
return order
node_1 = TreeNode(1)
node_2 = TreeNode(2)
node_3 = TreeNode(3)
node_1.set_children(node_2, node_3)
node_4 = TreeNode(4)
node_2.set_children(node_4)
node_5 = TreeNode(5)
node_6 = TreeNode(6)
node_3.set_children(node_5, node_6)
node_7 = TreeNode(7)
node_8 = TreeNode(8)
node_5.set_children(node_7, node_8)
tree = Tree(node_1)
# 先序遍歷:[1, 2, 4, 3, 5, 7, 8, 6]
print("先序遍歷:" + tree.pre_order().__str__())
# 中序遍歷:[4, 2, 1, 7, 5, 8, 3, 6]
print("中序遍歷:" + tree.middle_order().__str__())
# 中序遍歷:[4, 2, 7, 8, 5, 6, 3, 1]
print("後序遍歷:" + tree.after_order().__str__())
# 層序遍歷:[1, 2, 3, 4, 5, 6, 7, 8]
print("層序遍歷:" + tree.sequence_order().__str__())