参考自:这里
- 前序遍历
/*
* 当一个指针从栈中弹出来时,此树的左子树已经遍历完成。
* p如果不为空,表示当前需要遍历p所指向的树(这棵树还没有开始遍历)。
*/
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode p = root;
while(!stack.isEmpty() || p != null) {
if(p != null) {
stack.push(p);
result.add(p.val); // Add before going to children
p = p.left;
} else {
TreeNode node = stack.pop();
p = node.right;
}
}
return result;
}
- 中序遍历
/*
* 当一个指针从栈中弹出来时,此树的左子树已经遍历完成。
* p如果不为空,表示当前需要遍历p所指向的树(这棵树还没有开始遍历)。
*/
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode p = root;
while(!stack.isEmpty() || p != null) {
if(p != null) {
stack.push(p);
p = p.left;
} else {
TreeNode node = stack.pop();
result.add(node.val); // Add after all left children
p = node.right;
}
}
return result;
}
- 后序遍历
/*
* 后序遍历的反向结果是类似与先序遍历的形式:根->右子树->左子树
* 当一个指针从栈中弹出来时,此树的右子树已经遍历完成。
* p如果不为空,表示当前需要遍历p所指向的树(这棵树还没有开始遍历)。
*/
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> result = new LinkedList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode p = root;
while(!stack.isEmpty() || p != null) {
if(p != null) {
stack.push(p);
result.addFirst(p.val); // Reverse the process of preorder
p = p.right; // Reverse the process of preorder
} else {
TreeNode node = stack.pop();
p = node.left; // Reverse the process of preorder
}
}
return result;
}