前序
昨天我們分析了樹形結構和特點,特別是二叉樹結構和特點,手動創建了一個二叉樹,並實現了先序,中序,後序三種遍歷方式,那麼今天就先來一個動態創建二叉樹,並且是一個二叉查找樹。
什麼是二叉查找樹?
二叉查找樹是一種特殊的二叉樹
特點:
- 左側樹節點全部比根節點小,右側樹節點全部比根節點大。
- 任意一個節點左兒子節點小,右兒子節點大。
通過這個結構,查找一個數將會非常方便。
來一個動態創建的二叉查找樹
定義一個數組,用於創建二叉樹的數據
int[] arr = { 3, 1, 5, 7, 9, 4 };
創建二叉樹步驟解析:
- 以數組arr第一個索引【3】爲二叉樹根節點(根節點root)
- 以數組arr第二個索引【1】,和根節點比較,小於設置爲根節點左側兒子節點(根節點-左兒子)
- 以數組arr第三個索引【5】,和根節點比較,大於設置爲根節點右側兒子節點(根節點-右兒子)
- 以數組arr第四個索引【7】,和根節點比較大於,在和根節點右兒子比較大於,設置爲右側節點(根節點-右兒子-右孫子)
- 以數組arr第五個索引【9】,和根節點比較大於,在和根節點右兒子比較大於,在和根右孫子節點比較大於,設置爲右側節點(根節點-右兒子-右孫子-右曾孫子)
- 以數組arr第五個索引【4】,和根節點比較大於,在和根右兒子比較小於,設置爲右兒子左側節點(根節點,右兒子,左孫子)
代碼邏輯
根據上述二叉樹步驟解析,通過自定義一個包裝類,完成二叉樹的創建
public class TreeRoot {
private TreeNode treeNode;
public TreeNode getTreeRoot() {
return treeNode;
}
public void setTreeRoot(TreeNode treeNode) {
this.treeNode = treeNode;
}
**代碼l邏輯說明:**如果比當前根節點要小,那麼放到當前根節點左邊,如果比當前根節點要大,那麼放到當前根節點右邊。
/**
* 創建二叉樹
*
* @author 張江豐
* @param tr
* 二叉樹包裝對象
* @param value
* 節點值
*/
public static void createTree(TreeRoot tr, int value) {
// 首先判斷根節點數據爲空
if (tr.getTreeRoot() == null) {
// 直接把value設置給root
tr.setTreeRoot(new TreeNode(value));
} else {
// 根不爲空的
// value大於根節點設置到右側
if (value > tr.getTreeRoot().getValue()) {
// 根右側節點爲空,直接設置
if (tr.getTreeRoot().getRightNode() == null) {
tr.getTreeRoot().setRightNode(new TreeNode(value));
} else {
// 右側節點不爲空
TreeNode trr = comparTree(tr.getTreeRoot().getRightNode(), value);
// tr.setTreeRoot(trr);
}
} else {
// value小於根節點設置到左側
if (tr.getTreeRoot().getLeftNode() == null) {
tr.getTreeRoot().setLeftNode(new TreeNode(value));
// tr.setTreeRoot(new TreeNode(value));
} else {
// 左側節點不爲空
TreeNode trl = comparTree(tr.getTreeRoot().getLeftNode(), value);
// tr.setTreeRoot(trl);
}
}
}
}
如果是孫子節點,通過遞歸判斷定位存放位置
/**
* 遞歸判斷--判斷數據存放節點位置
*
* @author 張江豐
* @param tn
* 左側/右側節點對象
* @param value
* 節點值
* @return
*/
public static TreeNode comparTree(TreeNode tn, int value) {
// 判斷value比節點數據大
if (value > tn.getValue()) {
// 右側節點爲空,直接設置value
if (tn.getRightNode() == null) {
tn.setRightNode(new TreeNode(value));
return tn;
} else {
// 遞歸判斷下一級節點
comparTree(tn.getRightNode(), value);
}
} else {
// value比節點數據小
if (tn.getLeftNode() == null) {
// 左側節點爲空,直接設置value
tn.setLeftNode(new TreeNode(value));
return tn;
} else {
// 左側節點有數據,遞歸判斷下一級節點
comparTree(tn.getLeftNode(), value);
}
}
return tn;
}
數據測試
public static void main(String[] args) {
int[] arr = { 3, 1, 5, 7, 9, 4 };
TreeRoot tr = new TreeRoot();
for (int i : arr) {
createTree(tr, i);
}
// TreeNode.befoTree(tr.getTreeRoot());
TreeNode.betTree(tr.getTreeRoot());
// TreeNode.afterTree(treeNode);
}
驗證:
這裏使用中序遍歷方式,中序遍歷的順序(左->根->右),輸出結果應該爲1-3-4-5-7-9,遍歷代碼具體請看【來玩二叉樹NO.1】–之遍歷算法
控制檯輸出
邏輯debug
動態創建二叉查找樹完成了,後續更新二叉樹的深度,最大值等知識點,希望通過博客記錄對自己和大家有所幫助。