题目描述
题目链接:二叉树的前序遍历_牛客题霸_牛客网 (nowcoder.com)
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
数据范围:二叉树的节点数量满足 0 \le n \le 100 \0≤n≤100 ,二叉树节点的值满足 1 \le val \le 100 \1≤val≤100 ,树的各节点的值各不相同
示例 1:
示例1
输入:
{1,#,2,3}返回值:
[1,2,3]
题目解读:
说到二叉树的前序遍历,很多人应该闭着眼睛也能做出来,确实,递归形式的二叉树遍历太简单了。但是如果面试官让你写非递归的呢,如果没有准备过,还是有点点难度的。
解题思想:
前序遍历就是 左 右根 ,它的非递归,就是先把根节点入栈,然后弹出,弹出之后就访问val 值,然后先添加右子树,再添加左子树,然后再弹出左子树,添加左子树的左子树 和右子树,直到栈为空,应该说,前序遍历的非递归和递归是非常相似的。 只是有几点需要注意 一个是,前序遍历 是在进入循环前 把根节点入栈,循环的判断条件也没有 判定根节点是否为空这一约束,所以需要单独判断,根节点是否为空。还有就是 ,每次加入当前节点的左子树和右子树都需要判空,非空才能加入栈。
代码注释(递归):
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 {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型一维数组
*/
public int[] preorderTraversal (TreeNode root) {
// write code here
ArrayList<Integer> list = new ArrayList<>();
preorder(list,root);
int[] arr = new int[list.size()];
for(int i=0;i< list.size();i++){
arr[i] = list.get(i);
}
return arr;
}
public void preorder(ArrayList<Integer> list,TreeNode root){
if(root == null)
return;
list.add(root.val);
preorder(list,root.left);
preorder(list,root.right);
}
}
代码注释(非递归):
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 {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型一维数组
*/
public int[] preorderTraversal (TreeNode root) {
// write code here
// 单独进行根节点的判空
if(root == null)
return new int[0];
ArrayList<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
list.add(node.val);
if(node.right!=null)
stack.push(node.right);
if(node.left != null)
stack.push(node.left);
}
int[] arr = new int[list.size()];
for(int i=0;i< list.size();i++){
arr[i] = list.get(i);
}
return arr;
}
}