BST二叉查找树
2016-07-30 17:53
190 查看
#include<iostream> using namespace std; typedef struct node { int data; struct node* lchild; struct node* rchild; }NODE; //注:平均深度 O(log N) void Insert(NODE *&p, int x) { if (p == NULL) { p = (NODE*)malloc(sizeof(NODE)); p->data = x; p->lchild = NULL; p->rchild = NULL; } else { if (x < p->data) Insert(p->lchild, x); else Insert(p->rchild, x); } } NODE *Create(NODE *p,int a[],int n)//建立方法只需要插入一系列的值即可 { for (int i = 0; i < n; i++) Insert(p, a[i]); return p; } void Print(NODE *p) {//通过中序输出得到的是递增有序的数 if (p!=NULL) { Print(p->lchild); cout << p->data; Print(p->rchild); } } NODE *FindMin(NODE *p)//查找最小的点 { if (p == NULL) return NULL; if (p->lchild == NULL) return p; else return FindMin(p->lchild); //由于左子树永远小于右子树,所以只需要遍历左边的 } NODE* Del(NODE *p, int x) {//删除有三种情况:1)没有子节点 2)有一个子节点 3)有两个子节点 if (p == NULL) return NULL; else { if (x < p->data) p->lchild=Del(p->lchild, x); else if (x > p->data) p->rchild=Del(p->rchild, x); else if (p->data == x) { NODE *temp = p; if (p->lchild == NULL&&p->rchild == NULL) { //如果左右节点均不存在,则直接删除 free(p); p = NULL; } //若存在一个子节点,则把子节点的地址赋值给删除的那块节点 else if (p->lchild != NULL&&p->rchild == NULL) { p = p->lchild; free(temp); } else if (p->lchild == NULL&&p->rchild != NULL) { p = p->rchild; free(temp); } else if (p->lchild != NULL&&p->rchild != NULL) { //如果左右节点都存在,则找到右子树中最小的节点并代替它 temp = FindMin(p->rchild); p->data = temp->data; p->rchild=Del(p->rchild, p->data); } } } return p; } int main(void) { NODE*a=(NODE*)malloc(sizeof(NODE)); a = NULL; int n[6] = { 3,4,1,6,5,2 }; a=Create(a,n,6); //将n数组中的值依次插入 Del(a, 5); Print(a); system("pause"); }
相关文章推荐
- LNMP-源码 nginx ,keepalived
- Hadoop是什么?
- jdk及其工具包的下载及安装
- windows下安装CI框架
- noip2011 计算系数
- python之pygame 简单开始
- 0级DOM
- uploadify 在chrome上崩溃的办法
- 文件管理常用命令详解
- spring mvc 重定向及中文乱码问题
- ListView异步加载与缓存
- Windows API HOOK
- go web服务(1)
- 堆排序
- 网络工程1.3——Ping和Tracert命令
- android JSON 解析
- Swift - pods中导入的Object-C文件在桥接文件中写入找不到的问题
- 基数排序
- DEV C++ "把着手教" 单步调试(debug)
- 网站访问速度加速的方法