算法10---二叉搜索树

算法10---二叉搜索树

搜索树数据结构支持许多动态集合操作,包括search,minimum,maximum,predecessor,successor,insert和delete等。

概念:二叉搜索树。对于任何节点x,其左子树中的关键字最大不超过x.key,其右子树中的关键字最小不低于x.key。其运行实际和树的高度成正比;

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #ifndef _Tree_H
  5
  6 struct treenode;
  7 typedef  struct treenode *position;
  8 typedef struct treenode *searchtree;
  9
 10
 11
 12 searchtree makeempty(searchtree T);//二叉搜索树置空
 13 position find(searchtree T,int key);//在二叉搜索树内查找key
 14 position find_in_recursion(searchtree T,int key);//递归查找
 15 position findmin(searchtree T);//找二叉搜索树内最小值
 16 position findmax(searchtree T);//找二叉搜索树内最大值
 17 searchtree tree_successor(searchtree T);//二叉搜索树内后继节点
 18 searchtree tree_predecessor(searchtree T);//二叉搜索树内前驱
 19
 20 position insertposition(searchtree T,int key);//用于找到key值的插入点
 21 void insert(searchtree T,int key);//插入值,非递归方法
 22 searchtree insert_recursion(searchtree T,int key);//递归方法插入值
 23 void transplant(searchtree T,position u,position v);//使用节点v代替u
 24 void tree_delete(searchtree T,int key);//
 25
 26 void inorder_tree_work(searchtree T);//中序遍历二叉搜索树
 27
 28
 29 #endif
 30
 31
 32 typedef struct treenode
 33 {
 34     int key;
 35     int data;
 36     searchtree left;
 37     searchtree right;
 38     searchtree parent;
 39 }treenode;
 40
 41
 42 //中序遍历
 43 void inorder_tree_work(searchtree T)
 44 {
 45     if (T!=NULL)
 46     {
 47         inorder_tree_work(T->left);
 48         printf("%d\n",T->key);
 49         inorder_tree_work(T->right);
 50     }
 51 }
 52
 53
 54 //清空搜索树
 55
 56 searchtree makeempty(searchtree T)
 57 {
 58     if (T!=NULL)
 59     {
 60         makeempty(T->left);
 61         makeempty(T->right);
 62         free(T);
 63     }
 64     return NULL;
 65 }
 66
 67 //查找,一种方法是递归,一种方法是非递归
 68 //我们先采用递归的方法
 69 position find(searchtree T,int key)
 70 {
 71     if (T==NULL||key==T->key)
 72     {
 73         return T;
 74     }
 75     if (key<T->key)
 76     {
 77         return find(T->left,key);
 78     }
 79     else
 80         return find(T->right,key);
 81 }
 82
 83
 84 position find_in_recursion(searchtree T,int key)
 85 {
 86     while (T!=NULL&&key!=T->key)
 87     {
 88         if (key<T->key)
 89         {
 90             T=T->left;
 91         }
 92         else
 93             T=T->right;
 94     }
 95     return T;
 96 }
 97
 98
 99 //找二叉搜索树中的最大值和最小值也有递归和非递归的方法,不过我们在这采用非递归的方法;
100
101 position findmin(searchtree T)
102 {
103     while (T->left!=NULL)
104     {
105         T=T->left;
106     }
107     return T;
108 }
109
110 position findmax(searchtree T)
111 {
112     while (T->right!=NULL)
113     {
114         T=T->right;
115     }
116     return T;
117 }
118
119
120 //找二叉搜索树的前驱和后驱节点
121
122 position tree_successor(position T)
123 {
124     if (T->right!=NULL)
125     {
126         return findmax(T->right);
127     }
128     position y;
129     y=T->parent;
130     while(y!=NULL&&T==y->right)
131     {
132         T=y;
133         y=y->parent;
134     }
135     return y;
136 }
137
138 position tree_predecessor(position T)
139 {
140     if (T->right!=NULL)
141     {
142         return findmin(T->left);
143     }
144     position y;
145     y=T->parent;
146     while(y!=NULL&&T==y->left)
147     {
148         T=y;
149         y=y->parent;
150     }
151     return y;
152 }
153
154 //先采用递归的方法
155
156 searchtree insert_recursion(searchtree T,int key)
157 {
158     if (T==NULL)
159     {
160         T=(treenode *)malloc(sizeof(struct treenode));
161         if (T==NULL)
162         {
163             printf("out of space!\n");
164             return NULL;
165         }
166         else
167         {
168             T->key=key;
169             T->left=T->right=NULL;
170         }
171     }
172     else if (key<T->key)
173     {
174         T->left=insert_recursion(T->left,key);
175     }
176     else
177         T->right=insert_recursion(T->right,key);
178
179
180     return T;
181
182 }
183
184 position insertposition(searchtree T,int key)
185 {
186     position s;
187     position p = T;
188     while(p!=NULL)
189     {
190         s=p;
191         if (p->key==key)
192         {
193             return NULL;
194         }
195         p=(key<p->key)? p->left:p->right;
196     }
197     return s;
198 }
199
200 void insert(searchtree T,int key )
201 {
202     position p=insertposition(T,key);
203     position y=NULL;
204     position x=T;
205     while(x!=NULL)
206     {
207         y=x;
208         if (key<x->key)
209         {
210             x=x->left;
211         }
212         else
213             x=x->right;
214     }
215     p->parent=y;
216     if (y==NULL)
217     {
218         T=p;
219     }
220     else if (p->key<y->key)
221     {
222         y->left=p;
223     }
224     else
225         y->right=p;
226
227 }
228
229 //二叉搜索树的删除操作
230 void transplant(searchtree T,position u,position v)//使用节点v代替u
231 {
232     if (u->parent==NULL)
233     {
234         T=u;
235     }
236     else if (u==u->parent->left)
237     {
238         u->parent->left=v;
239     }
240     else
241         u->parent->right=v;
242     if (v!=NULL)
243     {
244         v->parent=u->parent;
245     }
246 }
247
248 void tree_delete(searchtree T,int key)//二叉搜索树的删除操作
249 {
250     position p=insertposition(T,key);
251     if (p->left==NULL)
252         transplant(T,p,p->right);
253     else if (p->right==NULL)
254         transplant(T,p,p->left);
255     else
256     {
257         position y=findmin(p->right);
258         if (y->parent!=p)
259         {
260             transplant(T,y,y->right);
261             y->right=p->right;
262             y->right->parent=y;
263         }
264         transplant(T,p,y);
265         y->left=p->left;
266         y->left->parent=y;
267     }
268 }
269
270 int main()
271 {
272     return 0;
273
274 }
时间: 2024-08-26 15:02:19

算法10---二叉搜索树的相关文章

70 数组的Kmin算法和二叉搜索树的Kmin算法对比

[本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array-vs-kmin-of-bst.html [分析] 数组的Kmin算法和二叉搜索树的Kmin算法非常类似,其本质是找序列中的第K大或者第K小的元素,可以借鉴QuickSort的思想加以实现. [Kmin_of_Array] C++ Code 1234567891011121314151617181920212223242526272829303132333435363738394041

C++算法之 二叉搜索树转换为双向链表

题目: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的方向: 分析: 1:由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点.当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可.进而更新当前链表的最后一个结点指针. 2:由于中序遍历过程正好是转换成链表的过程,即可采用递归处理 代码: // BT.cpp : 定义控制台应用程序的

数据结构与算法之二叉搜索树

与链表不同,树是一种非线性的数据结构.树中最常用的是二叉树,二叉树限制了子树的数量,也就是每个结点的子树至多2个,并且这两个子树是有顺序的.而二叉搜索树(二叉查找树,二叉排序树)是指根节点的关键字大于左子树的,而小于右子树,并且,左右子树也是一颗二叉搜索树.也就是说中序遍历一颗二叉搜索树,它的输出是从小到大排序好的. 除了普通的二叉搜索树之外,还有很多关于它的变形. 二叉平衡搜索树,即即是一颗二叉平衡树,也是一颗搜索树,平衡树即任意一个结点的左子树的高度与右子树的高度之差的绝对值不大于1. 红黑

一步两步学算法之二叉搜索树

Binary Search Tree  又叫二叉查找树,二叉排序树 这是种什么样的树呢? 其实就是根节点的左子树比根节点小  右子树比根节点大  同时 左子树和右子树也是二叉搜索树 代码比较简单 基本用递归实现 比较好理解  只有删除带有左右子树的节点时比较难理解 方法就是 直接在右子树找一个最小的节点 取代要被删除的节点 再继续删除右子树里的节点 详细看代码 1 #include "stdio.h" 2 #include "stdlib.h" 3 typedef

算法导论—二叉搜索树(BST)

华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/9/9 与散列表一样,搜索树数据结构也支持动态集合操作,包含插入,查询,删除,最小值,最大值,前驱,后继等. 一.二叉搜索树: 二叉搜索树节点:关键字key,卫星数据,左孩子指针,右孩子指针,父节点指针,其他特殊类型(红黑树的节点颜色,AVL树的树高等). 二叉搜索树性质:x是二叉搜索树中的任意一个节点.若y是x左子树中任意一个节点有x.key>=y.key.若y是x右子树中任意一个节点有x.key<=y.key. 二.二叉搜索树的

算法导论-----------二叉搜索树

先上二叉树查找树的删除的代码,因为删除是二叉查找树最复杂的操作: int BinarySearchTree<T>::tree_remove(const T& elem) { BinarySearchTreeNode<T> *z = tree_search(elem);//根据元素查找到要删除的节点 BinarySearchTreeNode<T> *x, *y; if (z != NULL) { //用y来表示实际要删除的节点 if (z->left ==

【算法设计-二叉搜索树】二叉查找树的操作与实现

二叉查找树某个结点的左子树的值都比它小,其右子树的值比它大. 要实现的主要操作 代码实现 #include <iostream> using namespace std; // BST的结点 typedef struct node { int key; struct node *lChild, *rChild,*parent; }Node, *BST; BST lvis=NULL;//用来保存父节点的地址 void createBST(BST &p); void assignmentP

数据结构与算法问题 二叉搜索树

1.序 具体实现了二叉查找树的各种操作:插入结点.构造二叉树.删除结点.查找.  查找最大值.查找最小值.查找指定结点的前驱和后继 2.二叉查找树简单介绍 它或者是一棵空树:或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上全部结点的值均小于它的根结点的值. (2)若右子树不空.则右子树上全部结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树 3.二叉查找树的各种操作 此处给出代码.凝视很具体.具体操作请參考代码: #include <iostream> using

hdu 3999 The order of a Tree (二叉搜索树)

1 /****************************************************************** 2 题目: The order of a Tree(hdu 3999) 3 链接: http://acm.hdu.edu.cn/showproblem.php?pid=3999 4 题意: 给你一个序列建立一棵二叉搜索树 要你找出另外一个序 5 列,可以建立和原序列建立的二叉搜索树一样且这个序列 6 是字典序最小 7 算法: 二叉搜索树 8 思想: 对于一个

算法导论第十二章 二叉搜索树

一.二叉搜索树概览 二叉搜索树(又名二叉查找树.二叉排序树)是一种可提供良好搜寻效率的树形结构,支持动态集合操作,所谓动态集合操作,就是Search.Maximum.Minimum.Insert.Delete等操作,二叉搜索树可以保证这些操作在对数时间内完成.当然,在最坏情况下,即所有节点形成一种链式树结构,则需要O(n)时间.这就说明,针对这些动态集合操作,二叉搜索树还有改进的空间,即确保最坏情况下所有操作在对数时间内完成.这样的改进结构有AVL(Adelson-Velskii-Landis)