前序遍历和后续遍历
前序遍历的顺序是:根 左 右 ;压栈顺序就是根 右 左
后续遍历:左 右 根 ;可以通过根 右 左 的顺序遍历,最后反序得到;压栈顺序:根 左 右
中序遍历:注意根不能先入栈了,利用一个移动结点,在while内入栈,不断左 入栈,最后出栈 ,再压右
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
#
# @param root TreeNode类
# @return int整型一维数组
#
#先序遍历的实现根, 左, 右 需要先压入根,再将右压入,再压左,
#迭代法 ,先实现根 右 左 再reverse
class Solution:
def postorderTraversal(self , root ):
if root == None:
return []
stack = [root]
result = []
while stack:
top = stack.pop()
#将根的值压入结果
result.append(top.val)
#压入左,右,才能访问根,右,左
if top.left:
stack.append(top.left)
if top.right:
stack.append(top.right)
#反序输出
return result[::-1]
#迭代实现二叉树的先序遍历
#递归的就是用栈实现的
def preorderTraversal(self, root):
if not root:
return []
stack = [root]
result = []
while stack:
top = stack.pop()
result.append(top.val)
if top.right:
stack.append(top.right)
if top.left:
stack.append(top.left)
return result
#中序遍历
def inorderTraversal(self, root):
if not root:
return []
stack = []
p = root
result = []
while stack or p:
while p:
stack.append(p)
p = p.left
if stack:
p = stack.pop()
result.append(p.val)
p = p.right
return result