题目:
给定一个二叉树,返回它的前序 遍历。
Given a binary tree, return the preorder traversal of its nodes' values.
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
Follow up: Recursive solution is trivial, could you do it iteratively?
解题思路:
遍历顺序:根节点 --> 左子节点 --> 右子节点
如下所示的二叉树:
A
/ \
B C
/ \ / \
D E F G
其遍历顺序为:A -> B -> D -> E -> C -> F -> G
类似 N 叉树那种, 两种思路: 递归和迭代, 很简单, 类似的题目可以参考:
LeetCode 589: N 叉树的前序遍历 N-ary Tree Preorder Traversal
LeetCode 590: N 叉树的后序遍历 N-ary Tree Postorder Traversal
LeetCode 429: N 叉树的层序遍历 N-ary Tree Level Order Traversal
递归法:
Java:
class Solution {
List<Integer> res =new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
preorderHelper(root);
return res;
}
private void preorderHelper(TreeNode root){
if(root==null)return; // 基线条件
res.add(root.val);
preorderHelper(root.left); // 递归左子树
preorderHelper(root.right); // 递归右子树
}
}
Python:
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res=[]
def preorderHelper(root):
if not root:return # 基线条件
res.append(root.val)
preorderHelper(root.left) # 递归左子树
preorderHelper(root.right) # 递归右子树
preorderHelper(root)
return res
迭代法:
Java:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();//数组
if (root == null) return list;
Stack<TreeNode> stack = new Stack<>();//用数据结构栈暂存节点
TreeNode cur = root;//定义当前节点
while (!stack.isEmpty() || cur != null) {//循环条件:栈不空或当前节点不空
if (cur != null) {//当前节点不空时
list.add(cur.val);//数组存入节点的值
stack.push(cur);//当前节点入栈
cur = cur.left;//刷新当前节点
} else {//当前节点空时
cur = stack.pop();//当前节点的父节点出栈
cur = cur.right;//刷新当前节点
}
}
return list;
}
}
Python:
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
#初始化数组、栈
res, stack = list(), list()
#当前节点指向根节点
cur = root
#递归条件为:栈或当前节点非空
while stack or cur:
if cur: #当前节点非空时
#其值存入数组
res.append(cur.val)
stack.append(cur)
#刷新当前节点
cur = cur.left
else:
#当前节点为空时其父节点出栈
cur = stack.pop()
#刷新当前节点
cur =cur.right
return res