原题链接:https://oj.leetcode.com/problems/binary-tree-preorder-traversal/
我知道这题应该用栈。但是不知道怎么用。
方法I: Use Stack
Below are three iterative solutions. What's the difference between them?
I.1 Reference: http://leetcode0.blogspot.com/2013/11/binary-tree-preorder-traversal.html
public class Solution {
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
if(root == null) return result;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.add(root);
while(!stack.isEmpty()){
TreeNode element = stack.peek();
result.add(element.val);
stack.pop();
if(element.right!=null){
stack.add(element.right);
}
if(element.left!=null){
stack.add(element.left);
}
}
return result;
}
}
I.2 Reference:
http://www.darrensunny.me/leetcode-binary-tree-preorder-traversal/
package me.darrensunny.leetcode;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
/**
* LeetCode - Binary Tree Preorder Traversal
* Created by Darren on 14-5-21.
*/
public class BinaryTreePreorderTraversal {
// Iterative
// 400ms for 67 test cases
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
if (root == null)
return result;
Deque<TreeNode> stack = new ArrayDeque<TreeNode>(); // Used to restore parents
TreeNode p = root;
while (p != null || !stack.isEmpty()) {
if (p != null) { // Whenever we meet a node, push it into the stack and go to its left subtree
stack.push(p);
result.add(p.val); // Access the value of current node
p = p.left;
} else { // Left subtree has been traversed, add the value of current node, and go to its right subtree
p = stack.pop();
p = p.right;
}
}
return result;
}
}
1.3 Reference: http://blog.sina.com.cn/s/blog_65dcacbb0100hwba.html
status Traverse(BiTree T, status(* visit)(TElemType e)){
IniTStack(s); p=T; p1=NULL;
while(p || !StackEmpty(s)){
if(p){
Push(s,p);
//visit,先序
p=p->lchild;
}else{
GetTop(s,p);
//visit,中序
if(p->rchild==p1 || p->rchild==NULL){
Pop(s,p1);p=NULL;
//visit,后序
}else{
p=p->rchild;p1=NULL;
}
}
}
}
方法II: Morris。不懂原理。
public class Solution {
//Solution 3: Morris
public List<Integer> preorderTraversal(TreeNode root) {
TreeNode cur = root;
TreeNode prev = null;
ArrayList<Integer> result = new ArrayList<Integer>();
while(cur!=null){
if(cur.left == null){
result.add(cur.val);
cur = cur.right;
}
else{//cur.left!=null
//find the predecessor of cur
prev = cur.left;
while(prev.right != null && prev.right != cur){//why need prev.right != cur?
prev = prev.right;
}
if(prev.right == null){
result.add(cur.val);
prev.right = cur;
cur = cur.left;
}
else{
prev.right = null;
cur = cur.right;
}
}
}
return result;
}
}