1、递归
List<Integer> result=new LinkedList<Integer>();
public List<Integer> inorderTraversal(TreeNode root) {
helper(root);
return result;
}
public void helper(TreeNode root){
if(root==null) return ;
helper(root.left);
result.add(root.val);
helper(root.right);
}
2、迭代,标准写法
之前是再用一个 while 一直加左,直到栈顶元素无左再继续加一下右(可以每次只加一次),但是还是会存在重复重复加栈顶左的情况,要用node.left=null;
可以利用一个指针cur,初始指向 root,如果当前cur非空,则将cur入栈,并指针指向其左;如果当前cur为空,则将指针指向栈顶,加入 result,cur=cur.right(关键),继续循环。在下次循环时,判断指针是否为空,如果不空则继续操作,如果为空则说明上次处理的节点的左为空或者右为空,即要处理栈顶元素
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result=new LinkedList<Integer>();
if(root==null) return result;
Stack<TreeNode> s=new Stack<>();
//s.push(root);
TreeNode cur=root;
while(cur!=null||!s.isEmpty()){ //栈为空,cur 不为空的情况是当前 cur 指向 root 的右节点
while(cur!=null){
s.push(cur);
cur=cur.left;
}
cur=s.pop();
result.add(cur.val);
cur=cur.right;
}
return result;
}
}
3、迭代,自己写的,要对 node.left=null
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result=new LinkedList<Integer>();
if(root==null) return result;
Stack<TreeNode> s=new Stack<>();
s.push(root);
while(!s.isEmpty()){
if(s.peek().left!=null){
TreeNode node=s.peek();
s.push(s.peek().left);
node.left=null;
}else{
TreeNode node=s.pop();
result.add(node.val);
// 技巧!!!!这里换成,cur=cur.right
if(node.right!=null){
s.push(node.right);
}
}
}
return result;
}