题目很简单,不用解释。递归实现很简单,但是题目要求不能使用递归的做,于是自然地想到使用栈模拟递归操作。
回顾之前的先根遍历:
判断栈内是否为空,
访问栈首元素,append到结果列表。
栈首又子树进栈,左子树进栈,重复循环。
这里由于先根的遍历当前栈首元素肯定要比其子树上的元素先被访问,所以直接把这个元素append到结果列表里面里就行了(也就是以队列的方式保存结果)。
换成后根遍历呢我们知道当前栈首元素肯定比他的子树后访问,所以把这个元素直接插进入到结果列表的头部(也就是以栈的方式保存结果)。
另外因为后根遍历顺序为:左子树,又子树,父亲节点。
所以上面循环中的左子树和又子树进栈顺序要交换一下。遂得到算法:
判断当前栈内是否为空,空结束
访问栈首元素,插入结果列表头部
栈首元素右左子树进栈,右子树进栈,重复循环
代码为:
class TreeNode:
def __init__(self,x):
self.val = x
self.left = None
self.right = None
class Solution:
def postorderTraversal(self,root):
if root == None:
return root
stack = []
ret = []
stack.append(root)
while stack:
node = stack.pop()
left = node.left
right = node.right
ret.insert(0,node.val)
if left != None:
stack.append(left)
if right != None:
stack.append(right)
return ret