题目:
Given a binary tree, return the postorder traversal of it’s nodes’ values.
For example:
Given binary tree{1,#,2,3},
1
2
/
3
return[3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?
解析:
这道题需要分别运用两个方法:递归法、迭代法去实现。首先明确一下二叉树的后序遍历是先左后右再根的顺序。
递归法:
递归法很简单,对于根节点,先遍历左子树,再遍历右子树,最后遍历自己,递归来看,对于左子树,也存在根节点,进一步按照后序遍历的顺序去做,同理右子树也是如此。
迭代法:
例子——
迭代法需要借助辅助栈,借助栈的先进后出特点去进行入栈出栈操作。
1)根节点(8)入栈,再按照先右后左入栈,如果左孩子还有左孩子或者右孩子,那么继续按先右后左的顺序入栈。则入栈为:8,9,3,5,2,到2后没有左右孩子,停止入栈;
2)由于2没有左右孩子,则用prev记录一下,再将2出栈,再继续判断5,同样出栈,并用prev记录,再到3,由于prev记录的5是它的右孩子,说明3的孩子已经遍历结束,因此将3也出栈,并将prev记录为3,综上,出栈依次为:2,5,3,栈内为:8,9,prev为3;
3)由于prev记录的3不为栈顶9的孩子结点,因此继续遍历9的孩子,做入栈操作,顺序仍然是先右后左,则入栈后为:8,9,12,34,10,到10后没有左右孩子,结束入栈,同2)中步骤,10出栈,prev记录的10不是34的孩子结点,继续入栈,栈内为:8,9,12,34,23,到23没有左右孩子,结束入栈。
4)栈顶23出栈,prev记录为23,是34的左孩子,因此34孩子遍历结束34出栈,prev为34,同理12、9、8依次出栈。
综合上述步骤出栈顺序为:2,5,3,10,23,34,12,9,8,即为后序遍历结果。
全部代码:
class treenode():
def __init__(self,left = None,right = None,value = None):
self.value = value
self.left = left
self.right = right
def settag(self,tag = None):
self.tag = tag
def insertnode(root,treenode):
tmp = root
if (root == None):
root = treenode
while(tmp != None):
if(treenode.val == tmp.val):
break
elif(treenode.val <= tmp.val):
if(tmp.left != None):
tmp = tmp.left
else:
tmp.left = treenode
else:
if(tmp.right != None):
tmp = tmp.right
else:
tmp.right = treenode
return root
def trivialnode(root):
if root:
trivialnode(root.left)
trivialnode(root.right)
print(root.val)
def iternode(root):
stack = []
pre = None
if root:
stack.append(root)
while stack:
curr = stack[len(stack) - 1]
if (curr.left == None and curr.right == None) or (pre and (pre == curr.left or pre == curr.right)):
print(curr.val)
stack.pop()
pre = curr
else:
if curr.right:
stack.append(curr.right)
if curr.left:
stack.append(curr.left)
if __name__=='__main__':
t=treenode()
L = [8,3,9,2,12,5,34,23,10]
t.val = L[0]
for x in L:
node = treenode()
node.val = x
t = insertnode(t,node)
print("递归法:")
trivialnode(t)
print("迭代法:")
iternode(t)