前序遍歷
若二叉樹非空,則執行以下操作:
- 訪問根結點;
- 先序遍歷左子樹;
- 先序遍歷右子樹
中序遍歷
若二叉樹非空,則執行以下操作:
- 中序遍歷左子樹;
- 訪問根結點;
- 中序遍歷右子樹。
后序遍歷
若二叉樹非空,則執行以下操作:
- 后序遍歷左子樹;
- 后序遍歷右子樹;
- 訪問根結點
實例說明
graph TD 3-->1 3-->5 1-->2 5-->4 5-->6
對於上面的二叉樹而言,
- 前序遍歷結果: 3 1 2 5 4 6
- 中序遍歷結果: 1 2 3 4 5 6
- 后序遍歷結果: 2 1 4 6 5 3
樹的遍歷代碼實現
定義一個樹結構
@ToString
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
定義一個遍歷方式的枚舉
/**
* 遍歷的方向.
*/
enum Direct {
/**
* 中序
*/
middle,
/**
* 前序
*/
before,
/**
* 后序
*/
after;
}
實現代碼
/**
* 遍歷.
*/
public void print(Direct direct) {
StringBuffer stringBuffer = new StringBuffer();
print(stringBuffer, this, direct, "ROOT:");
System.out.println(stringBuffer.toString());
}
private void print(StringBuffer stringBuffer, TreeNode treeNode, Direct direct, String node) {
if (treeNode != null) {
if (direct == Direct.before) {
stringBuffer.append(node + treeNode.val + "\n");
print(stringBuffer, treeNode.left, direct, "L:");
print(stringBuffer, treeNode.right, direct, "R:");
} else if (direct == Direct.middle) {
print(stringBuffer, treeNode.left, direct, "L:");
stringBuffer.append(node + treeNode.val + "\n");
print(stringBuffer, treeNode.right, direct, "R:");
} else {
print(stringBuffer, treeNode.left, direct, "L:");
print(stringBuffer, treeNode.right, direct, "R:");
stringBuffer.append(node + treeNode.val + "\n");
}
}
}
二叉查詢樹實現了二分查找法
時間復雜度是Olog(n)到O(n),也就是說它最好的情況是Olog(n),當然運氣不好,也就是你查詢的是葉子節點,那就是O(n)了。
/*
* 二分查找,最優時間復雜度OLog(n).
*/
private TreeNode search(TreeNode x, int key) {
if (x == null)
return x;
int cmp = key - x.val;
if (cmp < 0)
return search(x.left, key);
else if (cmp > 0)
return search(x.right, key);
else
return x;
}
public TreeNode search(int key) {
return search(this, key);
}
}
對於樹的知識還有很多,本文章主要介紹樹的遍歷和查找!