核心思想: 利用 栈 存储需要反复遍历的节点!
import java.util.Stack;
class Node {
int value;
Node left;
Node right;
int signal;
public Node() {}
public Node(int value, Node left, Node right, int signal) {
super();
this.value = value;
this.left = left;
this.right = right;
this.signal = signal;
}
}
public class Main {
public static void main(String[] args) {
Node rleft = new Node(9,null,null,0);
Node lright = new Node(7,null,null,0);
Node left = new Node(3,null,lright,0);
Node right = new Node(1,rleft,null,0);
Node tree = new Node(4,left,right,0);
PreOrder(tree);
PostOrder(tree);
InOrder(tree);
}
public static void InOrder(Node root) {
if(root == null)
return;
if(root.left == null && root.right == null) {
System.out.println(root.value);
return;
}
Node tree = root;
Stack<Node> st = new Stack<Node>();
st.push(tree);
while(!st.empty()) {
while(tree.left != null) {
st.push(tree.left);
tree = tree.left;
}
Node tmp = st.pop();
System.out.println(tmp.value);
if(tmp.right != null) {
st.push(tmp.right);
tree = tmp.right;
}
}
}
public static void PostOrder(Node root) {
if(root == null)
return;
if(root.left == null && root.right == null) {
System.out.println(root.value);
return;
}
Node tree = root;
Stack<Node> st = new Stack<Node>();
st.push(tree);
while(!st.empty()) {
Node tmp = st.lastElement();
if(tmp.signal == 0) {
if(tmp.left == null || tmp.left.signal == 2)
tmp.signal = 1;
else
st.push(tmp.left);
}
else if(tmp.signal == 1) {
if(tmp.right == null || tmp.right.signal == 2)
tmp.signal = 2;
else
st.push(tmp.right);
}
else if (tmp.signal == 2) {
System.out.println(tmp.value);
st.pop();
}
}
}
public static void PreOrder(Node root) {
Node tree = root;
Stack<Node> st = new Stack<Node>();
if(tree != null)
st.push(tree);
while(!st.empty()) {
Node tmp = st.pop();
if(tmp.signal == 0) {
System.out.println(tmp.value);
tmp.signal = 1;
if(tmp.left == null) {
if(tmp.right != null)
st.push(tmp.right);
}
else {
st.push(tmp);
st.push(tmp.left);
}
}
else {
if(tmp.right != null)
st.push(tmp.right);
}
}
}
}