Leetcode 145.二叉树的后序遍历
1 题目描述(Leetcode题目链接)
给定一个二叉树,返回它的 后序 遍历。
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
2 题解
二叉树的基本遍历方法之一。
递归方法:
# 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]:
retv = []
def posorder(root):
if root:
posorder(root.left)
posorder(root.right)
retv.append(root.val)
posorder(root)
return retv
迭代方法,需要借助栈的数据结构,类似前序与中序遍历,但是后序遍历需要多一个指针来记录上一个访问的节点,这样避免的是一个有右子树的节点被重复使用。
# 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]:
retv = []
stack = []
pre = None
while root or stack:
while root:
stack.append(root)
root = root.left
node = stack[-1]
if not node.right or node.right == pre:
retv.append(node.val)
pre = node
stack.pop()
root = None
else:
root = node.right
return retv
还有一种方法是按照前序的方法,不过遍历顺序是”根右左“,这样输出的时候将遍历结果倒过来输出就变成”左右根“的后序序列了。
# 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]:
if not root:
return []
retv = []
stack = [root]
while stack:
root = stack.pop()
if root.left:
stack.append(root.left)
if root.right:
stack.append(root.right)
retv.append(root.val)
return retv[::-1]