/**
* 漢諾塔
*
* @param n 盤子的個數
* @param start 開始的柱子
* @param middle 中介柱子
* @param end 結果柱子
*/
public static void towerOfHanoi(int n, int start, int middle, int end) {
if (n <= 1) {
System.out.println(start + "----->" + end);
} else {
towerOfHanoi(n - 1, start, end, middle);
System.out.println(start + "----->" + end);
towerOfHanoi(n - 1, middle, start, end);
}
}
測試打印結果:
二叉樹
Node<String> root = new Node<>(null, null, null);
/**
* 中序訪問樹的所有節點
*/
public void midOrderTraverse(Node root) {//邏輯
if (root == null) {
return;
}
//LDR
midOrderTraverse(root.leftChild);//邏輯
System.out.println("mid:" + root.data);//輸出
midOrderTraverse(root.rightChild);//邏輯
}
/**
* 前序訪問樹的所有節點
*/
public void preOrderTraverse(Node root) {
if (root == null) {
return;
}
//DLR
System.out.println("pre:" + root.data);
preOrderTraverse(root.leftChild);
preOrderTraverse(root.rightChild);
}
/**
* 後序訪問樹的所有節點
*/
public void postOrderTraverse(Node root) {
if (root == null) {
return;
}
//LRD
postOrderTraverse(root.leftChild);
postOrderTraverse(root.rightChild);
System.out.println("post:" + root.data);
}
/**
* 節點
*/
public static class Node<T> {
T data;
Node<T> leftChild;
Node<T> rightChild;
public Node(T data, Node<T> leftChild, Node<T> rightChild) {
this.data = data;
this.leftChild = leftChild;
this.rightChild = rightChild;
}
}
前序 (DLR)
若二叉樹爲空,則空操作返回,否則先訪問跟結點,然後前序遍歷左子樹,再前序遍歷右子樹
中序 (LDR)
若樹爲空,則空操作返回,否則從根結點開始(注意並不是先訪問根結點),
中序遍歷根結點的左子樹,然後是訪問根結點,最後中序遍歷右子樹
後續 (LRD)
若樹爲空,則空操作返回,否則從左到右先葉子後結點的方式遍歷訪問左右子樹,最後是訪問根結點
注:上述只貼出了部分代碼和圖,可能需要有點基礎的同學。