一、动态查找表
静态查找表只是对表中元素进行检索,返回成功或不成功!
动态查找表的表结构是在查找的过程中动态生成的。若表中存在关键字等于给定的值key的记录,则返回成功;否则,插入关键字等于key的记录。
二、二叉排序树
二叉排序树(BST)特点结点值的大小遵循“左<中<右”的排序,其中序遍历顺序必是严格递增的。
2.1 根据给定的数组按照“左<中<右”的排序原则建立二叉排序树。
2.2 删除:设结点p为待删除结点,
a.若结点p为叶子结点,若p的双亲节点parent的左子树为p,将parent的左子树设为空。p为parent的右子树同理可得
b.若待删除结点p只有左子树,将左子树替换结点p;若p结点只有右子树同理可得
c.若p的左右子树都存在,令s为其左子树,将左子树的最大值替换p,并调整s的子结点,保证除p外,中序遍历顺序不变。
具体代码如下(考虑了内存泄漏):
binarySortTree.h
template<typename T>
int getArrayLength(T &array) {
return (sizeof(array) / sizeof(array[0]));
}
//设计数据结构,构造二叉树
typedef struct node {
ElemType data;
struct node *lchild, *rchild;
}*BST;
//插入元素
bool insertBST(BST &T, ElemType element) {
if (T==NULL)
{
T = new node;
T->data = element;
T->lchild = T->rchild = NULL;
return true;
}
if (T->data==element) //元素的值不能和树中已有的值相等
{
return false;
}
if (element<T->data)
{
insertBST(T->lchild,element);
}
else
{
insertBST(T->rchild,element);
}
}
//创建二叉排序树
void createBST(BST &T,ElemType array[],int len){ //Debug模式下,未初始化的栈内存上的指针全部填成0xcccccccc;
T = NULL;
for (int i = 0; i < len; i++)
{
insertBST(T,array[i]);
}
}
void visit(ElemType elem) {
cout << elem << " ";
}
//中序遍历
void preOrderTraverse(BST &T) {
if (T!=NULL)
{
preOrderTraverse(T->lchild);
visit(T->data);
preOrderTraverse(T->rchild);
}
}
//释放内存
void relese(BST &T) {
if (T==NULL)
{
return;
}
relese(T->lchild);
relese(T->rchild);
delete T;
}
//删除某个结点
bool deleteNode(BST &T, ElemType element) {
if (T==NULL)
{
return false;
}
BST p,q,s,parent;
p = T;
while (p!=NULL)
{
if (p->data == element) break;
parent = p;
p = (p->data < element) ? p->rchild: p->lchild;
}
if (p==NULL)
{
cout << "该二叉排序树中无您要删除的值!"<<endl;
return false;
}
if ((p->lchild==NULL)&&(p->rchild==NULL))
{
//重置其父亲结点的左右子孩子
if (parent->lchild != NULL&&parent->lchild->data==element)
{
parent->lchild = NULL;
}
if (parent->rchild!=NULL&&parent->rchild->data==element)
{
parent->rchild = NULL;
}
return true;
}
else if (p->lchild!=NULL&&p->rchild==NULL)
{
//要让p的左孩子接上
s=p->lchild;
p ->data= s->data;
p->lchild = s->lchild;
delete s;
return true;
}
else if (p->lchild==NULL&&p->rchild!=NULL)
{
//要让p的右孩子接上
s = p->rchild;
p->data = s->data;
p->rchild = s->rchild;
delete s;
return true;
}
else
{
q = p;
s = p->lchild;
while (s->rchild!=NULL)
{
q = s;
s = s->rchild;
}
p->data = s->data;
if (q!=p)
{
q->rchild = s->lchild;
}
else
{
q->lchild = s->lchild;
}
delete s;
return true;
}
}
Search.cpp
int main()
{
//排序二叉树
ElemType c[] = {13,23,5,8,18,37,9};
len = getArrayLength(c);
BST T;
cout << "根据数组:";
for (int i = 0; i < len; i++)
{
visit(c[i]);
}
cout << endl;
cout << "建立二叉排序树" << endl;
createBST(T,c,len);
cout << "中序遍历:";
preOrderTraverse(T);
cout << endl;
cout << "请输入要删除的元素:";
ElemType data;
cin >> data;
deleteNode(T, data);
cout << "中序遍历:";
preOrderTraverse(T);
cout << endl;
//释放内存
relese(T);
system("pause");
return 0;
}
完整项目代码Github下载地址:
点击打开链接,欢迎fork