二叉查找树(Binary Search Tree)

Date:2019-06-25 14:40:32

基本操作

 1 //查找
 2 void Search(node *root, int x)
 3 {
 4     if(root == NULL)
 5     {
 6         printf("search failed\n");
 7         return;
 8     }
 9     if(x == root->data)
10         printf("%d\n", root->data);
11     else if(x < root->data)
12         Search(root->lchild, x);
13     else if(x > root->data)
14         Search(root->data)
15         Search(root->rchild, x);
16 }
17 
18 //插入
19 void Insert(node *root, int x)
20 {
21     if(root == NULL)
22     {
23         root = newNode(x);  //新建结点
24         return;
25     }
26     if(x == root->data)
27         return;
28     else if(x > root->data)
29         Insert(root->rchild, x);
30     else if(x < root->data)
31         Insert(root->lchild, x);
32 }
33 
34 //建立
35 node* Create(int data[], int n)
36 {
37     node *root = NULL;
38     for(int i=0; i<n; i++)
39         Insert(root, data[i]);
40 
41     return root;
42 }
43 
44 //删除
45 
46 //寻找前驱
47 node* FindMax(node *root)
48 {
49     while(root->rchild != NULL)
50         root = root->rchild;
51     return root;
52 }
53 
54 //寻找后继
55 node* FindMin(node *root)
56 {
57     while(root->lchild != NULL)
58         root = root->lchild;
59     return root;
60 }
61 
62 //删除结点root
63 void Delete(node *&root, int x)
64 {
65     if(root == NULL)
66         return;
67     if(root->data == x)
68     {
69         if(root->lchild==NULL & root->rchild==NULL) //叶子结点直接删除即可
70             root = NULL;
71         else if(root->lchild != NULL)
72         {
73             node *pre = FindMax(root->lchild);      //寻找左子树的最大值(最右结点)
74             root->data = pre->data;                 //与被删除结点替换
75             Delete(root->lchild, pre->data);        //删除替换后的结点
76         }
77         else if(root->rchild != NULL)
78         {
79             node *pre = FindMin(root->rchild);      //寻找右子树的最小值(最左结点)
80             root->data = pre->data;
81             Delete(root->rchild, pre->data);
82         }
83     }
84     else if(x < root->data)
85         Delete(root->lchild, x);
86     else if(x > root->data)
87         Delete(root->rchild, x);
88 }

删除优化

  • 删除操作中,找到替换结点后,该结点就是接下来需要删除的结点,直接删除即可
  • 目前PAT考试中还没有考察过删除结点相关的算法
  1 #include<stdio.h>
  2 const int M = 10;
  3 const int data[M] = {6,12,18,4,5,7,16,19,17,9};
  4 
  5 struct node
  6 {
  7     int data;
  8     node *lchild, *rchild;
  9 };
 10 
 11 node* FindMax(node *root)
 12 {
 13     while(root->rchild->rchild)
 14         root = root->rchild;
 15     return root;
 16 }
 17 
 18 node *FindMin(node *root)
 19 {
 20     while(root->lchild->lchild)
 21         root = root->lchild;
 22     return root;
 23 }
 24 
 25 void BST(node *&root, int x)
 26 {
 27     if(!root)
 28     {
 29         root = new node;
 30         root->data = x;
 31         root->lchild = NULL;
 32         root->rchild = NULL;
 33         return;
 34     }
 35     if(x == root->data)
 36     {
 37         if(!root->lchild && !root->rchild)
 38             root = NULL;
 39         else if(root->lchild)
 40         {
 41             node *pre;
 42             if(root->lchild->rchild == NULL)
 43             {
 44                 pre = root->lchild;
 45                 root->lchild = pre->lchild;
 46             }
 47             else
 48             {
 49                 node *fa = FindMax(root->lchild);
 50                 pre = fa->rchild;
 51                 fa->rchild = pre->lchild;
 52             }
 53             root->data = pre->data;
 54             delete(pre);
 55         }
 56         else if(root->rchild)
 57         {
 58             node *pre;
 59             if(root->rchild->lchild == NULL)
 60             {
 61                 pre = root->rchild;
 62                 root->rchild = pre->rchild;
 63             }
 64             else
 65             {
 66                 node *fa = FindMin(root->rchild);
 67                 pre = fa->rchild;
 68                 fa->rchild = pre->lchild;
 69             }
 70             root->data = pre->data;
 71             delete(pre);
 72         }
 73     }
 74     else if(x < root->data)
 75         BST(root->lchild, x);
 76     else if(x > root->data)
 77         BST(root->rchild, x);
 78 }
 79 
 80 void Traverse(node *root)
 81 {
 82     if(root == NULL)
 83         return;
 84     Traverse(root->lchild);
 85     printf("%d ", root->data);
 86     Traverse(root->rchild);
 87 }
 88 
 89 node* Create()
 90 {
 91     node *root = NULL;
 92     for(int i=0; i<M; i++)
 93         BST(root, data[i]);
 94 
 95     return root;
 96 }
 97 
 98 int main()
 99 {
100 #ifdef ONLINE_JUDGE
101 #else
102     freopen("Test.txt", "r", stdin);
103 #endif // ONLINE_JUDGE
104 
105     node *root = Create();
106     Traverse(root);
107     printf("\n");
108     BST(root, 6);
109     Traverse(root);
110 
111     return 0;
112 }

猜你喜欢

转载自www.cnblogs.com/blue-lin/p/11082782.html