题目
请用非递归方式实现二叉树的先序、中序和后序的遍历打印。
给定一个二叉树的根结点root,请依次返回二叉树的先序,中序和后序遍历(二维数组的形式)。
思路
非递归方式遍历二叉树。后序遍历有两种方式。
代码
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class TreeToSequence:
def __init__(self):
self.pre_order_list = []
self.mid_order_list = []
self.pos_order_list = []
def pre_order(self, root):
stack = []
if root:
stack.append(root)
while len(stack):
node = stack[-1]
stack.pop(-1)
self.pre_order_list.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
def mid_order(self, root):
stack = []
while len(stack) or root:
if root:
stack.append(root)
root = root.left
else:
root = stack[-1]
stack.pop(-1)
self.mid_order_list.append(root.val)
root = root.right
def pos_order1(self, root):
stack1 = []
stack2 = []
stack1.append(root)
while len(stack1):
node = stack1[-1]
stack1.pop(-1)
stack2.append(node)
if node.left:
stack1.append(node.left)
if node.right:
stack1.append(node.right)
while len(stack2):
node = stack2[-1]
stack2.pop(-1)
self.pos_order_list.append(node.val)
def pos_order2(self, root):
stack = []
h = root
stack.append(root)
while len(stack):
node = stack[-1]
if node.left and h != node.left and h != node.right:
stack.append(node.left)
elif node.right and h != node.right:
stack.append(node.right)
else:
self.pos_order_list.append(node.val)
h = node
stack.pop(-1)
def convert(self, root):
# write code here
res_list = []
self.pre_order(root)
self.mid_order(root)
self.pos_order1(root)
res_list.append(self.pre_order_list)
res_list.append(self.mid_order_list)
res_list.append(self.pos_order_list)
return res_list