给出一棵二叉树,返回这棵树的中序遍历
例如:
给出的二叉树为{1,#,2,3},
1\2/3
返回[1,3,2].
备注:递归的解法太没有新意了,你能用迭代的方法来解这道题吗?
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
//一眼就看出来是DFS中序啦,Tree就是这样,麻烦是麻烦,套路比较固定
/*方法一:
递归(这里用List)时间复杂度:O(n);空间复杂度:最坏情况下需要空间O(n),平均情况为O(logn)。*/
List< Integer > ans = new ArrayList<>();
helper(root, ans);
return ans;
}
public void helper (TreeNode node, List < Integer > ans){
if(node != null){
if(node.left != null){
helper(node.left, ans);
}
ans.add(node.val);
if(node.right != null){
helper(node.right, ans);
}
}
}
} class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
//一眼就看出来是DFS中序啦,Tree就是这样,麻烦是麻烦,套路比较固定
/*方法2:迭代 */
ArrayList < Integer > ans = new ArrayList < > ();
Stack < TreeNode > stack = new Stack < > (); //这里用栈实现
TreeNode curr = root ;
while(curr != null || !stack.isEmpty()){
while(curr != null){
stack.push(curr);
curr = curr.left;//左
}
curr = stack.pop();
ans.add(curr.val);//中
curr=curr.right;//右
}
return ans;
}
} /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//使用栈来实现非递归写法
public List<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> stack=new Stack<TreeNode>();
TreeNode node=root;
while(!stack.isEmpty()||node!=null){
while(node!=null){
stack.push(node);
node=node.left;
}
node=stack.pop();
list.add(node.val);
node=node.right;
} return list;
}
}
递归
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null)
return result;
result.addAll(inorderTraversal(root.left));
result.add(root.val);
result.addAll(inorderTraversal(root.right));
return result;
}
}
import java.util.*;
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null)
return result;
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.left;
}
if (!stack.isEmpty()) {
node = stack.pop();
result.add(node.val);
node = node.right;
}
}
return result;
}
}
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.*;
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
if(root==null) {
return new ArrayList<>();
}
ArrayList<Integer> list=new ArrayList<>();
list.addAll(inorderTraversal(root.left));
list.add(root.val);
list.addAll(inorderTraversal(root.right));
return list;
}
}
import java.util.*;
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> res = new ArrayList<Integer>();
Stack<TreeNode> s = new Stack<TreeNode>();
while(!s.isEmpty() || root != null) {
while(root != null) {
s.push(root);
root = root.left;
}
root = s.pop();
res.add(root.val);
root = root.right;
}
return res;
}
}
import java.util.*;
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (root != null || ! stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
list.add(root.val);
root = root.right;
}
return list;
}
}
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode cur = root; while(cur!=null || !stack.empty()){ while(cur!=null){ stack.add(cur); cur = cur.left; } cur = stack.pop(); list.add(cur.val); cur = cur.right; } return list; }