二叉树的后序遍历
问题描述:
给你二叉树的根节点 root ,返回它节点值的后序遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,2,3]
提示:
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
具体实现
对于节点A而言,顺序为BCA
对于节点B而言,顺序为DEB
对于节点D而言,顺序为FD
对于节点E而言,顺序为GE
对于节点F,G,C而言,顺序就是F,G,C
结合起来就是[[FD][GE]B]CA
综上所述后序遍历最终结果为FDGEBCA
解法一:
核心思想:递归法求二叉树的后序遍历
python3代码如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
arr=[]
def preorder(root:TreeNode,arr:List[int]):
if root:
arr.append(root.val)
preorder(root.left,arr)
preorder(root.right,arr)
preorder(root,arr)
return arr
解法二
核心思想:非递归法求二叉树的后序遍历(迭代法)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
res = list()
stack = list()
prev = None
while root or stack:
#左子树进栈
while root:
stack.append(root)
root = root.left
#最左子树出栈
root = stack.pop()
if not root.right or root.right == prev:
res.append(root.val)
prev = root
root = None
else:
#如果有右子树
stack.append(root)
root = root.right
return res