中序遍历
思想:使用栈来存储左子树的root,从而模拟递归的过程。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode p = root;
while (!stack.isEmpty() || p != null) {
while (p != null) {
stack.push(p);
p = p.left;
}
TreeNode tmp = stack.pop();
res.add(tmp.val);
p = tmp.right;
}
return res;
}
}
前序遍历
思想:在推入栈的同时就讲元素加入到结果集中,而不是像中序遍历那样在推出栈的时候才加入结果集。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode p = root;
while (p != null || !stack.isEmpty()) {
while (p != null) {
res.add(p.val);
stack.push(p);
p = p.left;
}
p = stack.pop().right;
}
return res;
}
}
后序遍历
思想:后序遍历是利用了前序遍历,将前序遍历的过程改动了一下,然后逆序输出即可得到后序遍历的结果。它的栈里存储的是右子树的root,而切换的时候也是切向了左子树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
TreeNode p = root;
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (p != null || !stack.isEmpty()) {
while (p != null) {
res.add(p.val);
stack.push(p);
p = p.right;
}
p = stack.pop().left;
}
Collections.reverse(res);
return res;
}
}