複習一波,go!
三種遍歷方式本質區別在於遍歷順序不同。
以L、D、R分別表示遍歷左子樹、訪問根節點、訪問右子樹,先序遍歷爲DLR;中序遍歷爲LDR;後序遍歷爲LRD。(別隻給三個字母就不認識誰是誰了,L就是left,……很好記憶)
有了遍歷順序,基於二叉樹的遞歸定義,可得下述遍歷二叉樹的遞歸算法:
- 先序遍歷二叉樹的操作定義爲:
(1)訪問根節點;
(2)先序遍歷左子樹;
(3)先序遍歷右子樹; - 中序:
(1)中序遍歷左子樹;
(2)訪問根節點;
(3)中序遍歷右子樹; - 後序:
(1)後序遍歷左子樹;
(2)後序遍歷右子樹;
(3)訪問根節點;
測試用的二叉樹:
遞歸代碼:
public class ThreeOrders {
public static void main(String[] args) {
// 構造二叉樹的代碼,忽略,看圖就好
TreeNode n = new TreeNode("A"), l = new TreeNode("B"), r = new TreeNode(
"C");
n.left = l;
n.right = r;
l.left = new TreeNode("D");
l.right = new TreeNode("E");
r.left = new TreeNode("F");
// 遍歷
System.out.print("先序遍歷:");
preOrder(n);
System.out.print("\n中序遍歷:");
midOrder(n);
System.out.print("\n後序遍歷:");
lastOrder(n);
}
private static void preOrder(TreeNode tree) {
// 順序DLR
/*
* visit(tree); if (tree.left != null) preOrder(tree.left); if
* (tree.right != null) preOrder(tree.right);
*/
// 寫法2
if (tree != null) {
visit(tree);
preOrder(tree.left);
preOrder(tree.right);
}
}
private static void midOrder(TreeNode tree) {
if (tree != null) {
midOrder(tree.left);
visit(tree);
midOrder(tree.right);
}
}
private static void lastOrder(TreeNode tree) {
if (tree != null) {
lastOrder(tree.left);
lastOrder(tree.right);
visit(tree);
}
}
private static void visit(TreeNode n) {
System.out.print(n.data);
}
}
class TreeNode {
String data;
TreeNode left, right;
public TreeNode(String s) {
data = s;
}
}
結果:
先序遍歷:ABDECF
中序遍歷:DBEAFC
後序遍歷:DEBFCA