前序遍历最为简单,因为其 要访问的元素 和 要处理的元素 顺序是一致的,都是中间节点。
1、前序遍历:
public List<Integer> preOrder(TreeNode root){
Deque<TreeNode> stack = new ArrayDeque<>();
List<Integer> res = new ArrayList<>();
stack.push(root);
while(!stack.isEmpty()) {
TreeNode node = stack.pop();
res.add(node.val);
if(node.right!=null) {
stack.push(node.right);
}
if(node.left!=null) {
stack.push(node.left);
}
}
return res;
}
2、中序遍历:
public List<Integer> inOrder(TreeNode root){
Deque<TreeNode> stack = new ArrayDeque<>();
List<Integer> res = new ArrayList<>();
TreeNode cur = root;
while(cur!=null || !stack.isEmpty()) {
if(cur!=null) {
stack.push(cur);
cur = cur.left;
}else {
cur = stack.pop();
res.add(cur.val);
cur = cur.right;
}
}
return res;
}
3、后序遍历:
前序遍历是“中左右”,后序是“左右中”,那么我们只需要调整一下先序遍历的代码顺序,就变为“中右左”的遍历顺序,然后再反转 result 数组,输出的结果就是后序结果了:
public List<Integer> postOrder(TreeNode root){
Deque<TreeNode> stack = new ArrayDeque<>();
List<Integer> res = new ArrayList<>();
stack.push(root);
while(!stack.isEmpty()) {
TreeNode node = stack.pop();
System.out.println("node.val:::" + node.val);
res.add(node.val);
if(node.left!=null) {
stack.push(node.left);
}
if(node.right!=null) {
stack.push(node.right);
}
}
System.out.println("res:::" + res);
Collections.reverse(res);
return res;
}
参考自:
二叉树:听说递归能做的,栈也能做!