递归法
核心就是下边三个顺序的区别
list.add(cur.val);//1
preorder(cur.left,list);//2
preorder(cur.right,list);//3
123 前序
213 中序
231 后序
迭代法
前序遍历
public static List<Integer> preorderTraversal2(TreeNode root){
ArrayList list = new ArrayList();
Deque que = new LinkedList();
if(root==null) return list;
que.push(root);
while(!que.isEmpty()) {
TreeNode tmp = (TreeNode) que.pop();
if(tmp!=null && tmp.right!=null) que.push(tmp.right);
if(tmp!=null && tmp.left!=null) que.push(tmp.left);
list.add(tmp.val);
}
return list;
}
中序
写了2个,第一个原创,第二个模仿
//stack
public static List<Integer> inorderTraversal2(TreeNode root) {
List list = new ArrayList<>();
Deque que = new LinkedList();
if(root==null) return list;
que.push(root);
while(!que.isEmpty()){
TreeNode tmp = (TreeNode) que.peek();
if(tmp!=null){
que.push(tmp.left);
}else{
que.pop();// 这里是push出去 上个循环的null节点 不是不行,但是逻辑复杂了
if(!que.isEmpty()) {
TreeNode tmp1 = (TreeNode) que.pop();
list.add(tmp1.val);
que.push(tmp1.right);
}
}
}
return list;
}
public static List<Integer> inorderTraversal3(TreeNode root) {
List list = new ArrayList<>();
Deque que = new LinkedList();
if(root==null) return list;
TreeNode tmp = root;
while(tmp!=null || !que.isEmpty()){
if(tmp!=null){
que.push(tmp);
tmp = tmp.left;//先移动,不push进去,就可以解决 inorderTraversal2中的复杂
}else{
tmp = (TreeNode) que.pop();
list.add(tmp.val);
tmp=tmp.right;
}
}
return list;
}
后序
public static List<Integer> postorderTraversal2(TreeNode root) {
ArrayList list = new ArrayList();
Deque que = new LinkedList();
if(root==null) return list;
que.push(root);
while(!que.isEmpty()) {
TreeNode tmp = (TreeNode) que.pop();
if(tmp!=null && tmp.left!=null) que.push(tmp.left);
if(tmp!=null && tmp.right!=null) que.push(tmp.right);
list.add(tmp.val);
}
Collections.reverse(list);
return list;
}