1. 程式人生 > >二分查詢,二叉查詢樹

二分查詢,二叉查詢樹

二分查詢

二分查詢,是一種在有序陣列中查詢某一特定元素的搜尋演算法。

將要查詢的值和陣列的中值進行比較,若小於中值則在中值前 面找,若大於中值則在中值後面找,等於中值時直接返回。

然後依次是一個遞迴過程,將前半部分或者後半部分繼續分解。

實現

 1  public static int BinarySearch(int[] arr, int low, int high, int key)
 2         {
 3             int mid = (low + high) / 2;
 4             if (low > high)
 5                 return
-1; 6 else 7 { 8 if (arr[mid] == key) 9 return mid; 10 else if (arr[mid] > key) 11 return BinarySearch(arr, low, mid - 1, key); 12 else 13 return BinarySearch(arr, mid + 1
, high, key); 14 } 15 } 16 }

 

二分查詢樹

二叉查詢樹有以下特點

  • 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
  • 任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
  • 任意節點的左、右子樹也分別為二叉查詢樹。
  • 沒有鍵值相等的節點(no duplicate nodes)

 實現

 1 public class Node {
 2         public int Key { get; set; }
 3         public
string Value { get; set; } 4 public Node LeftNode { get; set; } 5 public Node RigthNode { get; set; } 6 } 7 8 public class BST { 9 public Node Root { get; set; } 10 11 public void Push(int key,string value) 12 { 13 Root = Push(Root, key, value); 14 } 15 16 private Node Push(Node node,int key, string value) 17 { 18 if (node == null) 19 { 20 return new Node { Key = key ,Value = value}; 21 } 22 if (node.Key < key) 23 { 24 node.RigthNode = Push(node.RigthNode, key, value); 25 } 26 else if (node.Key > key) 27 { 28 node.LeftNode = Push(node.LeftNode, key, value); 29 } 30 return node; 31 } 32 33 public void PreOrder() 34 { 35 Console.WriteLine("start preorder"); 36 PreOrder(Root); 37 Console.WriteLine("end preorder"); 38 } 39 40 private void PreOrder(Node node) 41 { 42 Console.Write(node.Key + ":" + node.Value + "; "); 43 if (node.LeftNode != null) 44 PreOrder(node.LeftNode); 45 46 if (node.RigthNode != null) 47 PreOrder(node.RigthNode); 48 } 49 50 public string Find( int key) 51 { 52 return Find(Root, key); 53 } 54 55 private string Find(Node node, int key) 56 { 57 if (node == null) 58 { 59 return string.Empty; 60 } 61 if (node.Key == key) 62 { 63 return node.Value; 64 } 65 else if (node.Key > key) 66 { 67 return Find(node.LeftNode, key); 68 } 69 else 70 { 71 return Find(node.RigthNode, key); 72 } 73 } 74 }

跳躍表