1、前序遍历
如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。
public static List<Integer> preOrderTraversal(TreeNode root){
List<Integer> res = new ArrayList<>();
if(root == null) return res;
Deque<TreeNode> stack = new LinkedList<>();
TreeNode node = root;
//栈非空代表还有节点的右节点没被遍历
while(!stack.isEmpty() || node != null){
while(node != null){//代表应该节点第一次被遍历到
res.add(node.val);
stack.push(node);//为后续遍历该节点的右节点做准备
node = node.left;
}
node = stack.pop();//弹出已经遍历过的节点,刚好是由深往浅弹出
node = node.right;//该遍历各个右节点了
}
return res;
}
2、中序遍历
访问到达左子树的最底部,再开始处理节点
public static List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Deque<TreeNode> stack = new LinkedList<TreeNode>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
res.add(root.val);
root = root.right;
}
return res;
}
3、后序遍历
反转法:与前序遍历类似的过程,不过是中右左(左右反了),然后将最后的res结果反转就是后序遍历了
public static List<Integer> postOrderTraversal(TreeNode root){
List<Integer> res = new ArrayList<Integer>();
if(root == null){
return res;
}
Deque<TreeNode> stack = new LinkedList<>();
TreeNode node = root;
while(!stack.isEmpty() || node != null){
while(node != null){
res.add(node.val);
stack.push(node);
node = node.right;
}
node = stack.pop();
node = node.left;
}
//res结果反转
Collections.reverse(res);
return res;
}