分析:
先序:訪問根節點、先序遍歷左子樹、先序遍歷右子樹
中序:中序遍歷左子樹,訪問根節點,中序遍歷右子樹
後序:後序遍歷左子樹,後序遍歷右子樹,訪問根節點
因此,遞歸實現就很簡單
public class test3 {
public class Node{
private int value;
private Node leftNode;
private Node rightNode;
public Node(int value){
this.value = value;
}
}
//先序遍歷
public void preOrder(Node root){
if (root == null)
return;
System.out.println(root.value + "訪問根節點");
preOrder(root.leftNode);
preOrder(root.rightNode);
}
//中序遍歷
public void innerOrder(Node root){
if (root == null)
return;
innerOrder(root.leftNode);
System.out.println(root.value + "訪問根節點");
innerOrder(root.rightNode);
}
//後序遍歷
public void posOrder(Node root){
if (root == null)
return;
posOrder(root.leftNode);
posOrder(root.rightNode);
System.out.println(root.value + "訪問根節點");
}
}
用遞歸實現的都可以使用棧實現 先看先序遍歷 1、申請一個棧stack,將頭結點壓入stack中 2、從stack中彈出頭結點,記爲cur,打印cur的值,再將cur的右孩子壓入棧中,再將cur的左孩子壓入棧中 3、不斷重複2,直到stack爲空
public void preUncur(Node root){
if (root != null){
Stack<Node> stack = new Stack<>();
stack.add(root);
while (!stack.isEmpty()){
root = stack.pop();
if (root.rightNode != null)
stack.add(root.rightNode);
if (root.leftNode != null)
stack.add(root.leftNode);
}
}
}
中序遍歷 1、申請一個棧stack 2、先把頭結點壓入棧中,再把他的左邊界壓入棧中 3、重複2
public void innerUncer(Node root){
if (root != null){
Stack<Node> stack = new Stack<>();
stack.push(root);
if (!stack.isEmpty() && root != null){
if (root != null){
stack.push(root);
root = root.leftNode;
}else {
root = stack.pop();
System.out.println(root.value + "");
root = root.rightNode;
}
}
}
}
後序遍歷 1、申請兩個棧,將頭結點壓入棧stack中彈出stack中的頂點壓入stack1中, 2、若頭結點有孩子節點,則壓入stack中,直到無左右孩子,此時 3、彈出stack棧中的頂點壓入stack1中,重複2
public void posUncer(Node root){
if (root != null){
Stack<Node> stack = new Stack<>();
Stack<Node> stack1 = new Stack<>();
stack.push(root);
if (!stack.isEmpty()){
stack1.push(stack.pop());
if (root.leftNode != null){
stack.push(root.leftNode);
}
if (root.rightNode != null)
stack.push(root.rightNode);
}
while (!stack1.isEmpty()){
System.out.println(stack1.pop().value + "");
}
}
}