数据集合{62 88 58 47 35 73 51 99 37 93}
理论上建好的树是这样的
#include <iostream>
#include <cstdlib>
using namespace std;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
/*排序树搜索操作,如果存在,则返回key值所在节点的指针*/
BiTree Search(BiTree T, int key)
{
if (!T)
{
return NULL;
}
if (key == T->data)
{
return T;
}
else if (key < T->data)
{
return Search(T->lchild, key);
}
else
return Search(T->rchild, key);
}
/*二叉树插入操作*/
bool Insert(BiTree &T, int key)
{
if (!T)
{
T = new BiTNode;//为T分配空间
T->data = key;//数据域赋值
T->lchild = T->rchild = NULL;
}
if (key == T->data)
return false;
else if (key < T->data)
Insert(T->lchild, key);
else
Insert(T->rchild, key);
return true;
}
/*删除操作*/
bool Delete(BiTree &p)
{
BiTree q, s;
if (p->rchild == NULL)
{
q = p;
p = p->lchild;//当右子树为空时,将它左孩子替换它,再free掉此结点
free(q);
}
if (p->lchild == NULL)
{
q = p;
p = p->rchild;////当左子树为空时,将它右孩子替换它,再free掉此结点
free(q);
}
else//左右子树都不为空的情况
{
q = p;
s = p->lchild;//将需要删除结点赋值给q,再将左孩子赋值给s
while (s->rchild)//循环一直找到左子树的右节点的尽头
{
q = s;
s = s->rchild;
}
p->data = s->data;
if (q != p)
{
q->lchild = p->rchild;//重接左子树
}
else
q->lchild = s->lchild;//重接右子树
free(s);
}
return true;
}
/*搜索树删除操作*/
bool DeleteT(BiTree &T, int d)
{
if (!T)
cout<<"元素不存在";
else
{
if (d == T->data)
{
return Delete(T);
}
else if (d < T->data)
return DeleteT(T->lchild, d);
else
return DeleteT(T->rchild, d);
}
}
/*中序遍历*/
void InOrder(BiTree T)
{
if (T)
{
InOrder(T->lchild);
cout << T->data << " ";
InOrder(T->rchild);
}
}
int main()
{
int key;
BiTree T = NULL;
BiTree p = NULL;
cout<<"输入元素:";
/*35 37 47 51 58 62 73 88 93 99*/
for (int i = 0; i < 10; i++)
{
cin >> key;
Insert(T, key);
}
cout<<"输入的元素为(中序遍历):";
InOrder(T);
cout << endl;
cout << "输入需要查找的元素:";
cin >> key;
p = Search(T, key);
if (p)
{
cout << "找到key值"<<endl;
cout << "key的左节点数据是 " << p->lchild->data<<endl;
cout << "key的右节点数据是 " << p->rchild->data<<endl;
}
else cout << "没有找到";
cout << "输入需要删除的元素:";
cin >> key;
DeleteT(T, key);
cout << "删除" << key << "后,搜索树的中序遍历是:" << endl;
InOrder(T);
cout << endl;
system("pause");
}
删除62后的搜索树应该是这样的,它的中序遍历是35 37 47 58 51 73 88 93 99
下面是代码的运行情况
运行环境:Visual Stdio 2017
参考书籍:《大话数据结构》