來玩二叉樹【NO.2】--二叉查找樹

前序

昨天我們分析了樹形結構和特點,特別是二叉樹結構和特點,手動創建了一個二叉樹,並實現了先序,中序,後序三種遍歷方式,那麼今天就先來一個動態創建二叉樹,並且是一個二叉查找樹。

什麼是二叉查找樹?

二叉查找樹是一種特殊的二叉樹
特點:

  • 左側樹節點全部比根節點小,右側樹節點全部比根節點大。
  • 任意一個節點左兒子節點小,右兒子節點大。

通過這個結構,查找一個數將會非常方便。
在這裏插入圖片描述

來一個動態創建的二叉查找樹

定義一個數組,用於創建二叉樹的數據

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
在這裏插入圖片描述
動態創建二叉查找樹完成了,後續更新二叉樹的深度,最大值等知識點,希望通過博客記錄對自己和大家有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章