持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
一、题目描述:
给你一棵二叉树的根节点 root
,返回其节点值的 后序遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[3,2,1]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
- 树中节点的数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
二、思路分析:
后序遍历的迭代操作与前序遍历的迭代操作类似,
第一次遍历到根的到时候将根放入栈中并且遍历根的左节点,
区别在于第二次遍历到根的时候发现根在栈中,此时你不知道根的右节点是否访问过,所以需要一个visit数组进行判定,
第二次遍历完第三次遍历发现根在栈中并且根在visit数组之中(visit数组是用来区分第二次遍历到与第三次遍历到的),此时可以将根出栈并打印了,注意此时这个根已经访问完了,所以需要将对应的节点标记为None,方便下一次从栈中取出节点进行遍历
三、AC 代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
visit = []
result = []
stacks = []
current = root
while len(stacks) != 0 or current != None:
if current != None:
#不为None的时候,说明未曾被访问过
stacks.append(current)
current = current.left
else:
current = stacks[len(stacks)-1]
if current not in visit:
#visit用来标记右子树是否访问过,如果未标记过,访问右子树
visit.append(current)
current = current.right
else:
#右子树是否访问过,此时左右子树均访问过,开始访问根节点
stacks.pop()
result.append(current.val)
current = None
return result
范文参考: