一、后序遍历
二、递归实现
a. 先序遍历其左子树;
b. 先序遍历其右子树;
c. 访问根节点;
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
def postorder(root: TreeNode):
if not root:
return
postorder(root.left)
postorder(root.right)
res.append(root.val)
res = list()
postorder(root)
return res
三、迭代实现
后续遍历的非递归过程比较曲折,后续遍历需要先访问左右子结点后,才能访问该结点,而这也是非递归的难点所在。可以使用一个辅助栈来实现,但理解起来没有使用 2 个栈实现起来清晰,今天就用 2 个栈来实现非递归的后续遍历。
借助2个栈:s1 和 s2
a. 初始化根结点到s1中
b. 将 s1 栈顶元素 T 弹出,到栈 s2 中
c. 判断 T 是否有左右孩子,如果有依次入栈 s1,否则,执行 b
下面借助图,还是一样的树结构,来梳理一下思路
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
res = []
s1,s2 = [], []
s1.append(root)
while s1:
T = s1.pop()
s2.append(T)
if T.left:
s1.append(T.left)
if T.right:
s1.append(T.right)
while s2:
res.append(s2.pop().val)
return res
转载自微信公众号 Python编程爱好者