二叉树的前序遍历
问题描述:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,2,3]
提示:
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗?
具体实现
根据前序遍历的访问顺序:
对于节点A而言,顺序为ABC
对于节点B而言,顺序为BDE
对于节点C而言,顺序为C
对于节点D而言,顺序为DF
对于节点E而言,顺序为EG
结合起来就是A[B[DF][EG]]C
综上所述前序遍历最终结果为ABDFEGC
解释
二叉树的前序遍历,就是:
首先遍历根节点;
然后按照前序遍历的顺序访问根节点的左子树;
再按照前序遍历的顺序访问根节点的右子树。
解法一
核心思想:递归求解二叉树
需要知道前序遍历顺序是根->左->右
递归需要注意的地方:递归的三要素
- 递归必须有结束条件
- 递归是将问题更小化
- 主函数必须调用递归函数
以下面代码作为例子
11行 if root:作为结束条件
13行14行 使问题更小化
15行 主函数调用该递归函数
满足这3个条件,问题解决!!!
# 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
解法二
核心思想:非递归求解二叉树(迭代法),在C,Java,C++等语言可能需要使用栈,但是在python中可以使用列表来代替栈。
这是因为列表有pop函数,删除最后一个元素,并返回。这就是其他语言的出栈并获取该元素的操作
# 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]:
stack=[]
arr=[]
#根节点不为空或栈不为空
while root or stack:
#如果根节点不为空
while root:
#进栈,并将节点的左子树节点作为根节点
arr.append(root.val)
stack.append(root)
root=root.left
#如果栈不为空
if stack:
#出栈,并将节点的右子树节点作为根节点
root=stack.pop()
root=root.right
return arr
用上面那个图对非递归进行解释
栈不为空或树不为空
A进栈,B进栈,D进栈,D没有左子树
D出栈,节点为D的右子树F
栈不为空或树不为空
F进栈,无左子树
F出栈,无右子树
栈不为空或树不为空
F右子树为空,无进栈
B出栈,节点为B的右子树E
栈不为空或树不为空
E进栈,G进栈,G没有左子树
G出栈,G没有右子树
栈不为空或树不为空
G右子树为空,无进栈
E出栈,E没有右子树
栈不为空或树不为空
E没有右子树,无进栈
A出栈,A的右子树为C
栈不为空或树不为空
C进栈,C没有左子树
C出栈,C没有右子树
栈为空且树为空,退出
进栈顺序为:ABDFEGC
也就是前序遍历