二叉查找树的实现
查找树是一种数据结构,它支持很多动态的操作,包括search,maximum,predecessor,successor,insert,delete等操作!它既可以当作字典,又可以当作优先队列!
二叉查找树所有的基本操作与树的高度成正比,对于一棵含n个节点的完全二叉树,这些基本操作的最坏的运行情况是O(lgn)这对于一些基本的数据结构来讲,具有优势!
下面简要的实现这些基本的函数!
注意二叉查找树的性质 :对于任何一个节点,它的左子树的值是小于该节点的,而它右子树的任意节点是大于该节点的!
1 #include <cstdlib>
2 #include <iostream>
3 using namespace std;
4 typedef struct node
5 {
6 int data;
7 struct node* left;
8 struct node* right;
9 struct node* parent;
10 }_node,* pnode;
11 void insert(pnode &root, int value)
12 {
13 pnode y= NULL;
14 pnode x= root;
15 while (x!= NULL)
16 {
17 y= x;
18 if (value<x-> data)
19 {
20 x=x-> left;
21 }
22 else
23 x=x-> right;
24 }
25 pnode q= new _node;
26 q->data= value;
27 q->parent= y;
28 if (y== NULL)
29 root= q;
30 else if (q->data<y-> data)
31 y->left= q;
32 else
33 y->right= q;
34
35
36 }
37 // 中序遍历
38 void inorder(pnode root)
39 {
40 if (root!= NULL)
41 {
42 inorder(root-> left);
43 cout<<root->data<< endl;
44 inorder(root-> right);
45 }
46 }
47 pnode tree_search(pnode root , int key)
48 {
49 if (root==NULL||key==root-> data)
50 return root;
51 if (key<root-> data)
52 return tree_search(root-> left,key);
53 else
54 return tree_search(root-> right,key);
55 }
56 // 求出这个二叉查找树的最小值
57 pnode tree_minimum(pnode root)
58 {
59 while (root->left!= NULL)
60 {
61 root=root-> left;
62 tree_minimum(root);
63 }
64 return root;
65
66 }
67 // 求出这个二叉查找树的最大值
68 pnode tree_maxnum(pnode root)
69 {
70 while (root->right!= NULL)
71 {
72 root=root-> right;
73 tree_maxnum(root);
74 }
75 return root;
76 }
77 // 按中序遍历后的后继
78 pnode tree_successor(pnode x)
79 {
80 if (x->right!= NULL)
81 return tree_minimum(x-> right);
82 pnode y=x-> parent;
83 while (y!=NULL&&x==y-> right)
84 {
85 x= y;
86 y=y-> parent;
87 }
88
89
90 return y;
91 }
92 // 按中序遍历后的前驱
93 pnode tree_presuccessor(pnode x)
94 {
95 if (x->left!= NULL)
96 return tree_maxnum(x-> left);
97 pnode y=x-> parent;
98 while (y!=NULL&&x==y-> left)
99 {
100 x= y;
101 y=y-> parent;
102 }
103 return y;
104 }
105 pnode tree_delete(pnode & root ,pnode z )
106 {
107 pnode y; // 确定要删除的节点!
108 pnode x;
109 if (z->left==NULL||z->right== NULL)
110 y= z;
111 else
112 y= tree_successor(z);
113 if (y->left!= NULL)
114 x=y-> left;
115 else
116 x=y-> right;
117 if (x!= NULL)
118 x->parent=y-> parent;
119 if (y->parent== NULL)
120 root= x;
121 else if (y==y->parent-> left)
122 y->parent->left= x;
123 else
124 y->parent->right= x;
125 if (y!= z)
126 z->data=y-> data;
127 return y;
128
129 }
130
131 int main( int argc, const char * argv[])
132 {
133
134 pnode root= NULL;
135 int i;
136 int size;
137 cout<< " you want to build the size of the binary search tree: " << endl;
138 cin>> size;
139 for (i = 0 ; i < size ; i++ ) {
140 int value;
141 cin>> value;
142 insert(root,value);
143 }
144 cout<< " you want to search: " ;
145 int search_num;
146 cin>> search_num;
147 pnode q= tree_search(root,search_num);
148 if (q== NULL)
149 cout<< " fail to find " << endl;
150 else
151 cout<< " find it " << endl;
152
153 cout<< " inorder root: " << endl;
154 inorder(root);
155 cout<< " the max num of the binary tree is :\n " ;
156 q= tree_maxnum(root);
157 cout<<q->data<< endl;
158 cout<< " the min num of the binary tree is :\n " ;
159 q= tree_minimum(root);
160 cout<<q->data<< endl;
161 cout<< " please input the number you want to look at the successor of it:\n " ;
162 int num;
163 cin>> num;
164 pnode q1= tree_search(root,num);
165 q= tree_successor(q1);
166 cout<< " the successor is: " << endl;
167 cout<<q->data<< endl;
168 q= tree_presuccessor(q1);
169 cout<< " the presuccessor is : " << endl;
170 cout<<q->data<< endl;
171 cout<< " after delete the presuccessor :\n " ;
172 tree_delete(root,q1);
173 inorder(root);
174 return 0 ;
175 }
分类: 数据结构
标签: 数据结构
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did48511