二叉排序樹建立詳解
阿新 • • 發佈:2021-06-10
二叉排序樹建立詳解
說明
- 二叉排序樹是二叉樹的一種,它的左子節點元素值總是小於父節點,右子節點值總是大於父節點
- 而且它各個節點之間通過引用連線,具有連結串列的靈活結構,因此增加和刪除元素是非常快的,只需要判斷當前要新增的值和葉子節點的大小關係,然後新增即可
- 也因為它的左右子節點值和父節點值的關係,使用二叉排序樹在查詢元素時總能折半查詢,類似二分查詢,因此具有很高的查詢效率
- 二叉排序樹新增節點思路:
- 先判斷要新增的節點元素值和當前節點元素值的大小關係
- 如果要新增的元素大於當前元素,則應該新增到當前節點的右邊,再判斷當前節點的右側是否為空,如果為空,則直接新增,如果不為空則遞迴新增
- 如果要新增的元素小於等於當前元素,則應該新增到當前節點的左側,同理,如果當前節點的左側為空,則直接新增,否則遞迴新增
- 中序遍歷較為簡單,不再說明
- 原始碼見下
原始碼及分析
//測試 public static void main(String[] args) { int[] arr = {7, 3, 10, 12, 5, 1, 9}; BST bst = new BST(); //迴圈新增節點 for (int i = 0; i < arr.length; i++) { bst.add(new Node(arr[i])); } //中序遍歷檢視 System.out.println("中序遍歷"); bst.infixOrder(); } //二叉排序樹 class BST{ private Node root; //中序遍歷 public void infixOrder(){ if (root != null){ root.infixOrder(); }else { System.out.println("樹是空的"); } } //新增節點 public void add(Node node){ if (root == null){ root = node; }else { root.add(node); } } } //節點 class Node { int value; Node left; Node right; public Node(int value) { this.value = value; } //遞迴新增節點的方法 public void add(Node node) { //資料校驗 if (node == null) { return; } //根據要新增的節點的值和當前節點值的大小判斷節點要新增的位置 if (node.value < this.value) { //如果當前左子節點為空,則直接新增 if (this.left == null) { this.left = node; } else { //否則遞迴新增 this.left.add(node); } } else { //同理 if (this.right == null) { this.right = node; } else { this.right.add(node); } } } //中序遍歷 public void infixOrder(){ if (this.left != null){ this.left.infixOrder(); } System.out.println(this); if (this.right != null){ this.right.infixOrder(); } } @Override public String toString() { return "Node{" + "value=" + value + '}'; } }