给定一个数组,将该数组转化成二叉排序树
#include <iostream>
using namespace std;
struct BiTNode{
int data;
struct BiTNode *lchild, *rchild;//左右孩子
};
bool insertBST(BiTNode *&T,int element)
{
if(T==NULL)
{
T=new BiTNode;
T->data=element;
T->lchild=NULL;
T->rchild=NULL;
return true;
}
else
{
if(T->data==element)//如果有相等的元素,则不插进去
return false;
else if(T->data<element)
return insertBST(T->rchild,element);
else
return insertBST(T->lchild,element);
}
}
void createBST(BiTNode *&T,int *a,int n)
{
//T=NULL;
for(int i=0;i<n;i++)
insertBST(T,a[i]);//可以对insertBST的返回值进行判断,若为false,则直接退出createBST函数,表示插入失败
}
bool searchBST(BiTNode *&T,int key)
{
if(T==NULL)
return false;
else
{
if(key==T->data)
return true;
else if(key<T->data)
return searchBST(T->lchild,key);
else
return searchBST(T->rchild,key);
}
}
/**************二叉排序树的删除操作***************/
bool Delete(BiTNode *&p)//删除节点p
{
BiTNode *q,*s;
if(p->rchild==NULL)//若右子树为空,则只需要重接它的左子树
{
q=p;
p=p->lchild;
delete q;
}
else if(p->lchild==NULL)//若左子树为空
{
q=p;
p=p->rchild;
delete q;
}
else//左右子树均不为空
{
q=p;
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;//s指向被删除节点的直接前驱
if(q!=p)
q->rchild=s->lchild;//重接s的右子树
else
q->lchild=s->lchild;//重接s的左子树
delete s;
}
return true;
}
bool DeleteBST(BiTNode *&T,int key)
{
if(T==NULL)
return false;
else
{
if(key==T->data)
return Delete(T);
else if(key<T->data)
return DeleteBST(T->lchild,key);
else
return DeleteBST(T->rchild,key);
}
}
// 先序遍历
void preOrderTraverse(BiTNode* T)
{
if(T)
{
cout << T->data << " ";
preOrderTraverse(T->lchild);
preOrderTraverse(T->rchild);
}
}
// 中序遍历
void inOrderTraverse(BiTNode* T)
{
if(T)
{
inOrderTraverse(T->lchild);
cout << T->data << " ";
inOrderTraverse(T->rchild);
}
}
int main()
{
BiTNode *T=NULL;
int a[10] = {4, 5, 2, 1, 0, 9, 3, 7, 6, 8};
int n = 10;
// 并非所有的a[]都能构造出BST,所以,最好对createBST的返回值进行判断
createBST(T, a, n);
preOrderTraverse(T);
cout << endl;
inOrderTraverse(T);
cout << endl;
cout<<searchBST(T,6);
DeleteBST(T,5);//删除元素值为5的节点
inOrderTraverse(T);
cout << endl;
return 0;
}
结果如图:
第3行输出的数据有问题呀,第一个元素应该是0 ,但是输出的确实10,还没有找到错误的原因