博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法----二叉搜索树(Binary Search Tree)
阅读量:3906 次
发布时间:2019-05-23

本文共 2273 字,大约阅读时间需要 7 分钟。

一,性质

(1)二分搜索树是一颗二叉树(但不一定是完全二叉树),满足二叉树的所有定义;

(2)二分搜索树每个节点的左子树的值都小于该节点的值,每个节点右子树的值都大于该节点的值。
(3)以左右孩子为根的子树仍为二分搜索树
在这里插入图片描述

二,意义

(1)在查找元素时,我们于根节点进行对比后,就能每次近乎一半的去除掉查找范围,这就大大的加快了我们的查询速度,插入元素时也是一样。

(2)用来实现字典数据结构(查找表)
(3)高效,动态地维护数据
(4)min,max,floor,ceil,rank,select

三,基本操作

#include
#include
#include
#define maxsize 100struct node{ int key; char value;};typedef struct BST{ struct node data; struct BST *left; struct BST *right;}bs,*bst;bst find(int key,bst T){ if(T==NULL) return NULL; if(key
data.key) return find(key,T->left); else if(key>T->data.key) return find(key,T->right); else return T;}bst findMin(bst T){ if(T==NULL) return NULL; else if(T->left==NULL) return T; else return findMin(T->left);}bst findMax(bst T){ if(T!=NULL){ while(T->right!=NULL){ T=T->right; } } return T;}void visit(bst T){ if(T!=NULL){ printf("%c ",T->data.value); visit(T->left); visit(T->right); }}bst createTree(bst newtree,struct node a){//即insert if(newtree==NULL) { newtree=(struct BST *)malloc(sizeof(bs)); newtree->data.key = a.key; newtree->data.value = a.value; newtree->left=newtree->right=NULL; } else if(a.key
data.key) newtree->left=createTree(newtree->left,a); else if(a.key>newtree->data.key) newtree->right=createTree(newtree->right,a); return newtree;}bst DeleteNode(bst T,int key){ if(T==NULL){ printf("空树\n"); return NULL; } else if(key
data.key) delete(T->left); else if(key>T->data.key) delete(T->right); else if(T->left&&T->right){ bst Tmp = findMin(T->right); T->data = Tmp->data; T->right=DeleteNode(T->right,key); }else{ bst Tmp = T; if(T->left == NULL) T=T->right; else if(T->right == NULL) T=T->left; free(Tmp); } return T;}int main(){ bst tree=NULL; bst T,T1; struct node a[4]={ {5,'a'},{15,'b'},{7,'c'},{21,'d'}}; tree=createTree(tree,a[0]); tree=createTree(tree,a[1]); tree=createTree(tree,a[2]); tree=createTree(tree,a[3]); visit(tree); T=find(5,tree); printf(" %c ",T->data.value); printf("min:%d_%c ",findMin(tree)->data.key,findMin(tree)->data.value); printf("max:%d_%c ",findMax(tree)->data.key,findMax(tree)->data.value); T1 =DeleteNode(tree,5); visit(T1); return 0;}

主要是删除有点难,但其实也不难,

(1)被删节点只有一个孩子,把孩子替换成该节点
(2)被删节点有两个孩子,取左子树的最大点或者右子树的最小点来替代

转载地址:http://wgqen.baihongyu.com/

你可能感兴趣的文章
Ubuntu 12.04 安装 Subversion 1.7
查看>>
scp port 22: Connection refused
查看>>
ubuntu12.04命令行下安装RabbitVCS
查看>>
自定义cscope-index
查看>>
(ubuntu)在andorid andk工程中使用ccache加速编译速度
查看>>
android graphics system学习资料汇总
查看>>
GDB
查看>>
Oracle RAC Failover 详解
查看>>
[转载]Oracle RAC客户端连接不稳定的解决方法
查看>>
ORA RAC ORA-12545:因目标主机或对象不存在,连接失败!
查看>>
证明两节点能正常failover的sql
查看>>
oracle10g rac 报ora-12545错误的解决方案 转载
查看>>
Linux配置Xmanager
查看>>
IP地址正则表达式
查看>>
对SOAP消息头的处理
查看>>
webservice TCP Monitor
查看>>
Oracle中sysdate的时区偏差
查看>>
【每日一算】旋转有序数组
查看>>
【每日一算】两数之和
查看>>
深入理解Mysql索引底层数据结构与算法
查看>>