struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
};
typedef struct BiTNode BiTNode,*biTree;
一、二叉排序樹的查找
biTree SearchBST(biTree T,int key)
{
//在根指針T所指的二叉排序樹中遞歸地查找某關鍵字等於key的數據元素
//若查找成功,則返回指向數據元素節點的指針,否則,返回空指針
if (T==NULL)
{
return NULL;
}
else
{
if (key==T->data)
{
return T;
}
else if (key<T->data)
{
return (SearchBST(T->lchild,key));
}
else
{
return(SearchBST(T->rchild,key));
}
}
}
void InsertBST (biTree &T , int key)
{
if (T==NULL)
{
biTree x;
x=new BiTNode;
x->data=key;
x->lchild=x->rchild=NULL;
T=x;
cout<<"插入成功\n";
}
else
{
if (T->data==key)
{
cout<<"節點已存在\n"<<endl;
}
else if (key<T->data)
{
InsertBST(T->lchild,key);
}
else
{
InsertBST(T->rchild,key);
}
}
}
int dele(biTree &p)
{
biTree q,s;
if (p->lchild==NULL)
{
q=p;
p=p->lchild;
delete q;
}
else if (p->rchild==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;
if (q!=p)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
delete s;
}
return 1;
}
int deleteBTree(biTree &T,int num)
{
if (T==NULL)
{
return 0;
}
else
{
if (num==T->data)
{
return dele(T);
}
else if (num<T->data)
{
return deleteBTree(T->lchild,num);
}
else
{
return deleteBTree(T->rchild,num);
}
}
}
四、前序中序後序遍歷
void middVisit(biTree T)
{
if (T==NULL)
{
;
}
else
{
middVisit(T->lchild);
cout<<T->data<<" , ";
middVisit(T->rchild);
}
}
void firstVisit(biTree T)
{
if (T==NULL)
{
;
}
else
{
cout<<T->data<<" , ";
firstVisit(T->lchild);
firstVisit(T->rchild);
}
}
void lastVisit(biTree T)
{
if (T==NULL)
{
;
}
else
{
lastVisit(T->lchild);
lastVisit(T->rchild);
cout<<T->data<<" , ";
}
}
五、構建
biTree CreateTree()
{
biTree T=NULL;
int num=0;
cout<<"請輸入一次插入的值:";
cin>>num;
while (num!=-1)
{
InsertBST(T,num);
cout<<"下一個插入的值(-1結束):";
cin>>num;
}
cout<<"二叉樹建立完成\n";
return T;
}
六、運行程序#include"iostream"
using namespace std;
struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
};
typedef struct BiTNode BiTNode,*biTree;
/******************************************
函數名:biTree SearchBST(biTree T,int key)
功能:當二叉樹不空時將搜索值與根節點的關鍵字進行比較,若相等
查找成功,否則根據二者大小關係,分別在左子樹和右子樹上繼續進行查找
******************************************/
biTree SearchBST(biTree T,int key)
{
//在根指針T所指的二叉排序樹中遞歸地查找某關鍵字等於key的數據元素
//若查找成功,則返回指向數據元素節點的指針,否則,返回空指針
if (T==NULL)
{
return NULL;
}
else
{
if (key==T->data)
{
return T;
}
else if (key<T->data)
{
return (SearchBST(T->lchild,key));
}
else
{
return(SearchBST(T->rchild,key));
}
}
}
/******************************************
函數名:void InsertBST (biTree T , int key)
功能:在BST樹中插入一個新結點x時,若BST樹爲空,
則令新結點x爲插入後BST樹的根結點;
否則,將結點x的關鍵字與根結點T的關鍵字進行比較:
① 若相等: 不需要插入;
② 若x.key<T->key:結點x插入到T的左子樹中;
③ 若x.key>T->key:結點x插入到T的右子樹中。
由結論知,對於一個無序序列可以通過構造一棵BST樹
而變成一個有序序列。
由算法知,每次插入的新結點都是BST樹的葉子結點,
即在插入時不必移動其它結點,僅需修改某個結點的指針。
******************************************/
void InsertBST (biTree &T , int key)
{
if (T==NULL)
{
biTree x;
x=new BiTNode;
x->data=key;
x->lchild=x->rchild=NULL;
T=x;
cout<<"插入成功\n";
}
else
{
if (T->data==key)
{
cout<<"節點已存在\n"<<endl;
}
else if (key<T->data)
{
InsertBST(T->lchild,key);
}
else
{
InsertBST(T->rchild,key);
}
}
}
/***************************************
函數名稱:biTree CreateTree()
功能:構建二叉樹
***************************************/
biTree CreateTree()
{
biTree T=NULL;
int num=0;
cout<<"請輸入一次插入的值:";
cin>>num;
while (num!=-1)
{
InsertBST(T,num);
cout<<"下一個插入的值(-1結束):";
cin>>num;
}
cout<<"二叉樹建立完成\n";
return T;
}
int dele(biTree &p)
{
biTree q,s;
if (p->lchild==NULL)
{
q=p;
p=p->lchild;
delete q;
}
else if (p->rchild==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;
if (q!=p)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
delete s;
}
return 1;
}
int deleteBTree(biTree &T,int num)
{
if (T==NULL)
{
return 0;
}
else
{
if (num==T->data)
{
return dele(T);
}
else if (num<T->data)
{
return deleteBTree(T->lchild,num);
}
else
{
return deleteBTree(T->rchild,num);
}
}
}
void middVisit(biTree T)
{
if (T==NULL)
{
;
}
else
{
middVisit(T->lchild);
cout<<T->data<<" , ";
middVisit(T->rchild);
}
}
void firstVisit(biTree T)
{
if (T==NULL)
{
;
}
else
{
cout<<T->data<<" , ";
firstVisit(T->lchild);
firstVisit(T->rchild);
}
}
void lastVisit(biTree T)
{
if (T==NULL)
{
;
}
else
{
lastVisit(T->lchild);
lastVisit(T->rchild);
cout<<T->data<<" , ";
}
}
int main()
{
biTree T=CreateTree();
cout<<"中序遍歷結果:\n";
middVisit(T);
cout<<endl;
cout<<"前序遍歷結果:\n";
firstVisit(T);
cout<<endl;
cout<<"後序遍歷結果:\n";
lastVisit(T);
cout<<endl;
deleteBTree(T,7);
cout<<"中序遍歷結果:\n";
middVisit(T);
cout<<endl;
return 0;
}
七 、運行結果