题目:
给你二叉树的根节点 root ,返回它节点值的前序遍历。
数据范围:二叉树的节点数量满足 1≤n≤100,二叉树节点的值满足 1≤val≤100,树的各节点的值各不相同。
示例 1:
输入:{1,#,2,3}
返回值:[1,2,3]
思路1:递归法(根左右)
代码1
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
public int[] preorderTraversal (TreeNode root) {
//添加遍历结果的数组
List<Integer> list = new ArrayList();
//递归前序遍历
preorder(list, root);
//返回的结果
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++){
res[i] = list.get(i);
}
return res;
}
public void preorder(List<Integer> list, TreeNode root){
//遇到空结点则返回
if(root == null){
return;
}
//根
list.add(root.val);
//左
preorder(list, root.left);
//右
preorder(list, root.right);
}
}
思路2:迭代,栈(根右左)
第一次访问根节点根节点就能真正遍历输出。
注意:入栈和出栈顺序是反的,入栈时先入右孩子可以保证先pop的是左子树。
代码2
import java.util.*;
public class Solution {
public int[] preorderTraversal (TreeNode root) {
//添加遍历结果的数组
List<Integer> list = new ArrayList();
Stack<TreeNode> s = new Stack<TreeNode>();
//空树返回空数组
if(root == null){
return new int[0];
}
//根节点先进栈
s.push(root);
while(!s.isEmpty()){
//每次栈顶就是访问的元素
TreeNode node = s.pop();
list.add(node.val);
//如果右边还有右子节点进栈
if(node.right != null){
s.push(node.right);
}
//如果左边还有左子节点进栈
if(node.left != null){
s.push(node.left);
}
}
//返回的结果
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++){
res[i] = list.get(i);
}
return res;
}
}