题目描述
题目链接:二叉树的中序遍历_牛客题霸_牛客网 (nowcoder.com)
给定一个二叉树的根节点root,返回它的中序遍历结果。
数据范围:树上节点数满足 0 \le n \le 10000≤n≤1000,树上每个节点的值满足 0 \le val \le 10000≤val≤1000
进阶:空间复杂度 O(n),时间复杂度O(n)
示例1
输入:
{1,2,#,#,3}返回值:
[2,3,1]说明:
示例2
输入:
{}返回值:
[]
示例3
输入:
{1,2}返回值:
[2,1]
示例4
输入:
{1,#,2}返回值:
[1,2]
题目解读:
说到二叉树的中序遍历,很多人应该闭着眼睛也能做出来,确实,递归形式的二叉树遍历太简单了。但是如果面试官让你写非递归的呢,如果没有准备过,突然写,还是挺难的,那就来学习一下吧。
解题思想:
中序遍历就是 左 根 右 ,依次遍历嘛,那就按这个思想做。递归版本的,我就不说了,主要说非递归版本的,一开始就是 从根节点一直进行左子树遍历,把遍历结果放到栈里面,遍历完成后,开始从栈里面弹出一个节点,这个节点当然就是 左子树里最下面的那个节点,弹出它以后(它是左子树最下面的子树,所以它肯定就没有左子树了),直接访问它里面的值,因为后序遍历是 左 根 右 ,访问完之后, 要确认它有没有右子树,如果它没有右子树,那就继续弹出。如果它有右子树,那就让root去遍历它的右子树。就结束了。比起后序遍历,难度简单了很多。
代码注释(递归):
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[] inorderTraversal (TreeNode root) {
// write code here
ArrayList<Integer> list = new ArrayList<>();
inorder(list,root);
int[] arr =new int[list.size()];
for(int i=0;i< arr.length;i++){
arr[i] = list.get(i);
}
return arr;
}
public void inorder(ArrayList<Integer> list,TreeNode root){
if(root == null)
return;
inorder(list,root.left);
list.add(root.val);
inorder(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[] inorderTraversal (TreeNode root) {
// write code here
ArrayList<Integer>list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while(!stack.isEmpty() || root!= null){
while(root != null){
stack.push(root);
root = root.left;
}
TreeNode node =stack.pop();
list.add(node.val);
// 访问当前节点后,要判断它的右子树是否为空,不为空就访问
if(node.right != null)
root = node.right;
}
int[] arr = new int[list.size()];
for(int i=0;i< list.size();i++){
arr[i] = list.get(i);
}
return arr;
}
}