给出一棵二叉树,返回其中序遍历
给出二叉树 {1,#,2,3}
,
1 \ 2 / 3
返回 [1,3,2]
.
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
/*
1、递归法
这是思路最简单的方法,容易想到并且容易实现。递归的终止条件是当前节点是否为空。首先递归调用遍历左子树,然后访问当前节点,最后递归调用右子树。代码如下:
[cpp] view plain copy
//recursive
class Solution1 {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ret;
if(root==NULL)return ret;
inorderHelper(ret,root);
return ret;
}
private:
void inorderHelper(vector<int>& ret,TreeNode* root)
{
if(root==NULL)return;
inorderHelper(ret,root->left);
ret.push_back(root->val);
inorderHelper(ret,root->right);
}
};
*/
public class Solution {
/*public ArrayList<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
ArrayList<Integer> result = new ArrayList<Integer>();
TreeNode curt = root;
while (curt != null || !stack.empty()) {
//一直遍历到左子树最下边,边遍历边保存根节点到栈中
while (curt != null) {
stack.push(curt);
curt = curt.left;
}
if(!stack.empty()){
curt = stack.pop();
result.add(curt.val);
//进入右子树,开始新的一轮左子树遍历(这是递归的自我实现)
curt = curt.right;
}
}
return result;
}*/
public ArrayList<Integer> inorderTraversal(TreeNode root){
Stack<TreeNode> stack= new Stack<TreeNode>();
ArrayList<Integer> list = new ArrayList<Integer>();
TreeNode head = root;
while(!stack.empty()|| head !=null){
while(head !=null){
//先左子树进栈
stack.push(head);
head = head.left;
}
if(!stack.empty()){
head = stack.pop();
//添加左子树到list
list.add(head.val);
//再右子树
head = head.right;
}
}
return list;
}
}