//二叉排序数(二叉搜索树,二叉查找树)
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>using namespace std;
#define end 32767 // 定义结束标志//结点结构
typedef struct BiTNode
{
int data;struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;//二叉排序树的查找算法
//1.若查找到NULL,则搜索失败,否则:
//2.若x等于b的根节点的数据域之值,则查找成功;否则:
//3.若x小于b的根节点的数据域之值,则搜索左子树;否则:
//4.查找右子树。
bool SearchBST(BiTree T, int key, BiTree f, BiTree* p)
{
//T为待查找的二叉树的根节点,会随着查找过程移动;//key为待查找的值//f指向T的双亲,如果查找不成功,p=f,供插入过程使用;//p如果查找成功,则指向成功的结点,若不成功,则指向访问的最后一个结点,即fif (!T){
*p = f;return false;}else if (key == T->data){
*p = T;return true;}else if (key < T->data){
return SearchBST(T->lchild, key, T, p);}else if (key > T->data){
return SearchBST(T->rchild, key, T, p);}
}//二叉排序树的插入算法
//先查找二叉树中有没有待插入的元素,如果有,则不插入;
//如果没有,则插入在访问的最后一个结点即p的左子树或者右子数
bool InsertBST(BiTree* T, int key)
{
BiTree p, s;if (!SearchBST(*T, key, NULL, &p)) //如果查找失败{
s = (BiTree)malloc(sizeof(BiTNode));s->data = key;s->lchild = NULL;s->rchild = NULL;if (!p) // 二叉树为空,插入的s为根结点{
*T = s;}else if (key < p->data){
p->lchild = s;}else if (key > p->data){
p->rchild = s;}return true;}else //如果查找成功{
return false;}
}//二叉排序树的创建—使用二叉排序树的插入算法进行
void CreateBST(BiTree* T)
{
*T = (BiTree)malloc(sizeof(BiTNode));(*T)->lchild = NULL;(*T)->rchild = NULL;int c;scanf("%d", &c);if (*T && c != end){
(*T)->data = c;}while (c != end){
scanf("%d", &c);if (c != end && *T){
InsertBST(T, c);}}
}//二叉排序树的删除算法
//两种情况:1、待删除的结点是叶子结点或该结点只有左子树或右子数
//2、待删除的结点既有左子树又有右子树
bool Delete(BiTree* p);
bool DeleteBST(BiTree *T, int key)
{
if (!(*T)) // 如果没有查找到{
return false;}else{
if (key == (*T)->data){
return Delete(T);}else if (key < (*T)->data){
return DeleteBST(&(*T)->lchild, key);}else if (key >(*T)->data){
return DeleteBST(&(*T)->rchild, key);}}
}
bool Delete(BiTree* p)
{
BiTree q = NULL;BiTree s = NULL;//情况1—左右子树有一个为空或都为空if ((*p)->lchild == NULL){
q = *p;*p = (*p)->rchild;free(q);}else if ((*p)->rchild == NULL){
q = *p;*p = (*p)->lchild;free(q);}//情况2—左右子树都不为空else{
//不是直接删除该结点,而是用该结点的中序遍历前驱(左子树中最大的)替换为该结点q = *p; s = (*p)->lchild;while (s->rchild){
q = s;s = s->rchild;}(*p)->data = s->data;//然后再删除替换的结点,也分为两种情况//1、如果没有右子树,替换的结点就是待删除结点的左子结点,q = (*p)if (q == (*p)){
q->lchild = s->lchild;}//2、如果有右子树,q != (*p)else{
q->rchild = s->lchild;}free(s);}return true;
}int main()
{
BiTree T = NULL;//创建二叉排序树CreateBST(&T);//查找元素int key = 104;BiTree p = NULL;bool single = SearchBST(T, key, NULL, &p);if (single){
printf("查找成功");}else{
printf("查找失败");}//删除元素int k = 105;DeleteBST(&T, k);return 0;
}
详细解决方案
二叉排序树(二叉搜索树,二叉查找树)详细代码实现
热度:38 发布时间:2023-12-13 23:51:12.0
相关解决方案
- 二叉排序树(二叉链表存储 C语言)建立 中序输出 删除结点-->myajax95转移 ...
- 二叉排序树
- 【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查寻树简介
- 【牛客】二叉排序树(C++)
- 问题 A: 二叉排序树(二叉排序树基础的建立,遍历)
- 题目1467:二叉排序树 九度OJ
- 二叉树查找树、二叉排序树、二叉搜索树
- 二叉排序树(BinSortTree)
- (结构数组表示二叉树+堆+二叉排序树)笛卡尔树
- 二叉排序树(BST)插入
- 4.3 二叉排序树
- 二叉排序树(查找树)
- 北邮 BOJ 130 二叉排序树
- 二叉排序树(BST)的增删改查实现
- C语言,Math Dash的账户登录程序(二叉排序树)
- 数据结构-二叉排序树(BST树)
- 二叉树的应用——二叉排序树、选择树、判定树
- 二叉排序树(二叉查找树)BST构造,节点插入,节点查找,节点删除(java)
- 二叉排序树(二叉搜索树,二叉查找树)详细代码实现
- 【数据结构】二叉排序树(BST)
- 剑指offer- 30.二叉搜索树(二叉排序树)的后序遍历(179)
- 二叉排序树(二叉查找树、二叉搜索树)
- 二叉排序树(BST) 添加结点,删除结点
- 二叉排序树 九度教程第35题 二叉排序树的构建与遍历
- 搜索二叉树(二叉排序树)的插入 中序遍历
- zcmu--4933: 二叉排序树(二叉树遍历输出)
- 采用[二叉排序树]实现:判断给定的一个数字x是否在指定的一个无序的数字序列中存在...
- 97.二叉排序树
- 二叉排序树(含重复节点但不输出)
- 数据结构考研笔记(十三)——二叉排序树