排序二叉树的建立、插入、删除、查找
来源:互联网 发布:上古卷轴5清理脏数据 编辑:程序博客网 时间:2024/06/05 10:29
/*
名称:排序二叉树的建立、插入、删除、查找
说明:对于排序二叉树来说,其创建、插入和查找的算法差不多。简单来说,就是小了往左,大了往右。
对于二叉排序树的删除来说,稍微要复杂一点,要分成基本的几种情况:即
(1)、删除的结点是叶子节点
(2)、删除结点只有左子树或者只有右子树
(3)、删除的结点既有左子树、又有右子树
此外还要注意删除的结点是否是根节点,程序中需要稍微注意一下。
*/
//二叉排序树的插入int BST_Insert(BiTree &T,int key){ if(T == NULL) { T = new BiTNode; T->data = key; T->lchild = T->rchild = NULL; return 0; //插入成功 } else if(T->data == key) return -1; //树中已经含有元素,插入失败 else if(T->data < key) return BST_Insert(T->rchild,key); else return BST_Insert(T->lchild,key);}//创建二叉排序树void Creat_BSTree(BiTree &T){ int val = 0; cin>>val; while(-1 != val) { if(BST_Insert(T,val) == -1) cout<<"element has existed already , insert failed!"<<endl; cin>>val; }}//二叉排序树的查找BiTNode * BST_Search(BiTree T,int key){ BiTNode *p = T; while(p != NULL) { if(p->data < key) p = p->rchild; //转向右子树 else if(p->data > key) p = p->lchild; //转向左子树 else { return p; } } return NULL; //返回值为空代表未查找到指定元素}//二叉排序树的删除bool DelInBSTree(BiTree &T,int key){ BiTNode *p = T,*pre = NULL; //判断待删除的节点是不是根节点,如果是根节点的话,需要特殊处理下 if(T != NULL && T->data == key ) { if(T->rchild != NULL) T = T->rchild; else if(T->lchild != NULL) T = T->lchild; else T = NULL; return true; } else //删除的不是根结点 { while(p != NULL) { if(p->data < key) { pre = p; p = p->rchild; //转向右子树 } else if(p->data > key) { pre = p; p = p->lchild; //转向左子树 } else break; } if(p == NULL) return false; else { //若p的左子树和右子树都不为空时 if(p->lchild != NULL && p->rchild != NULL) //p的左子树和右子树都不为空 { pre = p; BiTNode *temp = pre->rchild; //temp指向待删除结点的后继结点,即上移元素后要删除的结点 //找到待删除元素的直接后继结点,用其代替当前节点 while(temp->lchild != NULL) { pre = temp; temp = temp->lchild; } p->data = temp->data; //上移元素 p = temp; } //如果被删除元素是叶子节点 if(p->lchild == NULL && p->rchild == NULL) { //将待删除结点的父节点对应指针域赋空 if(pre->lchild == p) pre->lchild = NULL; else if(pre->rchild == p) pre->rchild = NULL; delete p; //删除指定结点 } else if(p->lchild == NULL) //被删除结点的左子树为空,右子树不空 { if(pre->lchild == p) pre->lchild = p->rchild; else if(pre->rchild == p) pre->rchild = p->rchild; delete p; } else if(p->rchild == NULL) //被删除结点的右子树为空,左子树不空 { if(pre->lchild == p) pre->lchild = p->lchild; else if(pre->rchild == p) pre->rchild = p->lchild; delete p; } } return true; }}
阅读全文
0 0
- 排序二叉树的建立、插入、删除、查找
- 顺序二叉树的建立、查找、删除、插入、替换、遍历
- 二叉树的建立,删除,查找,插入,输出(数据结构)
- 二叉搜索(排序)树的 查找、插入、删除
- 二叉查找树的插入,删除,查找
- 二叉查找树的插入,删除,查找
- 二叉查找树的插入,删除,查找
- 二叉树的建立 插入 删除
- 二叉搜索树的建立 插入 删除
- 算法---二叉树的建立,查找,删除
- 二叉搜索树的查找、插入、删除
- 二叉搜索树的插入,查找,删除
- 二叉查找树的插入与删除
- 二叉查找树的基本操作(建立,插入,删除,遍历)
- 二叉树插入,查找 删除
- 二叉查找树插入删除
- 排序二叉树的插入和删除
- 二叉查找树的操作(插入、删除、查找)
- 树存储结构的几种表示方法
- 嵌入式实验(一)安装交叉编译工具链arm-none-linux-gnueabi-时遇到的问题
- Go-实现程序零点定时启动
- 在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件
- BZOJ3837: [Pa2013]Filary
- 排序二叉树的建立、插入、删除、查找
- 答辩题目:按钮布局
- 图灵机器人接口实现自动回复(web版)
- Codeforces Gym-101617G
- Lintcode 3. 统计数字
- CentOS7的运行级别
- 主席树区间第k大;非严格第k大
- Go-一些简单的类型转换及处理
- 树莓派WEB服务器