- 二叉树的前序遍历就是深度优先遍历
递归算法
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<>();
dfs(list,root);
int[] res=new int[list.size()];
for(int i=0;i<res.length;i++){
res[i]=list.get(i);
}
return res;
}
//递归,先输出根节点,再依次遍历左子树、右子树
public void dfs(List<Integer> list,TreeNode root){
if(root!=null){
list.add(root.val);
dfs(list,root.left);
dfs(list,root.right);
}
}
}
非递归算法
思路:用栈,先将根节点入栈,出栈的同时,先将右子树入栈,再将左子树入栈,循环执行即可
import java.util.*;
public class Solution {
public int[] preorderTraversal (TreeNode root) {
//根节点为空时,直接返回空数组
if(root==null)return new int[0];
//创建一个栈,初始状态将根节点入栈
//创建一个List,存储出栈的节点的值
Stack<TreeNode> st=new Stack<>();
st.push(root);
List<Integer> list=new ArrayList<>();
TreeNode t;
//当栈不为空时,循环
//判断栈不为空,使用方法empty()
while(!st.empty()){
t=st.pop();
list.add(t.val);
if(t.right!=null){
st.push(t.right);
}
if(t.left!=null){
st.push(t.left);
}
}
int[] res=new int[list.size()];
for(int i=0;i<res.length;i++){
res[i]=list.get(i);
}
return res;
}
}