二分查找,二叉查找树

二分查找

二分查找,是一种在有序数组中查找某一特定元素的搜索算法。

将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。

然后依次是一个递归过程,将前半部分或者后半部分继续分解。

实现

 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     }

跳跃表

posted @ 2018-12-18 13:20  JustDotNet  阅读(337)  评论(0编辑  收藏  举报