核心思想
以中序遍历为例
在迭代法中 我们拿到 1 节点 由于有左孩子 我们就会推入 2 节点,2 节点又有左孩子, 所以我们推入 4, 然后弹出 2 节点, 由于这是第二次访问 2 节点, 也就意味着左子树已经去过了, 所以推入 5 节点。
那么我们模拟一下 栈的变化
假设左边为栈顶。
1 -> 21 -> 421-> 21 -> 521 -> 21 -> 1 -> 31 -> 1
所以 每当一个节点我们访问到第二次的时候就是输出节点值的时候
那么我们可以每次入栈的时候 标记下节点的访问次数:
"first" -> 第一次
"second" -> 第二次
对于第一次访问的节点 我们依次推入他的 右中左 节点 这样从栈顶往下看 就是 左中右的顺序,也就是中序的顺序。
对于第二次访问的节点 我们记录他的节点值就好
来模拟一下 左边依然是栈顶
1 -> 213 -> 42513 -> 2513 -> 213 -> 13 -> 3
代码
中序遍历
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
LinkedList<Object> stack = new LinkedList<>();
stack.addFirst(root);
stack.addFirst("first");
while(!stack.isEmpty()){
String cnt = (String) stack.pollFirst();
TreeNode cur = (TreeNode) stack.pollFirst();
if(cur == null)
continue;
if(cnt.equals("first")){
stack.addFirst(cur.right);
stack.addFirst("first");
stack.addFirst(cur);
stack.addFirst("second");
stack.addFirst(cur.left);
stack.addFirst("first");
}else{
res.add(cur.val);
}
}
return res;
}
}
前序遍历
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
LinkedList<Object> stack = new LinkedList<>();
stack.addFirst(root);
stack.addFirst("first");
while(!stack.isEmpty()){
String p = (String) stack.pollFirst();
TreeNode cur = (TreeNode) stack.pollFirst();
if(cur == null)
continue;
if(p.equals("first")){
stack.addFirst(cur.right);
stack.addFirst("first");
stack.addFirst(cur.left);
stack.addFirst("first");
stack.addFirst(cur);
stack.addFirst("second");
}else{
res.add(cur.val);
}
}
return res;
}
}
后序遍历
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
LinkedList<Object> stack = new LinkedList<>();
stack.addFirst(root);
stack.addFirst("first");
while(!stack.isEmpty()){
String cnt = (String) stack.pollFirst();
TreeNode cur = (TreeNode) stack.pollFirst();
if(cur == null)
continue;
if(cnt.equals("first")){
stack.addFirst(cur);
stack.addFirst("second");
stack.addFirst(cur.right);
stack.addFirst("first");
stack.addFirst(cur.left);
stack.addFirst("first");
}else{
res.add(cur.val);
}
}
return res;
}
}
标签:cur,前中,res,节点,addFirst,迭代法,first,stack,二叉树
From: https://www.cnblogs.com/ganyq/p/18168182