数据结构二叉排序树实验报告Word格式.docx
《数据结构二叉排序树实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构二叉排序树实验报告Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
stdlib.h>
//二叉查找树结点描述
typedefintKeyType;
typedefstructNode
{
KeyTypekey;
//关键字
structNode*left;
//左孩子指针
structNode*right;
//右孩子指针
structNode*parent;
//指向父节点指针
}Node,*PNode;
//往二叉查找树中插入结点
//插入的话,可能要改变根结点的地址,所以传的是二级指针
voidinseart(PNode*root,KeyTypekey)
//初始化插入结点
PNodep=(PNode)malloc(sizeof(Node));
p->
key=key;
left=p->
right=p->
parent=NULL;
//空树时,直接作为根结点
if((*root)==NULL){
*root=p;
return;
}
//插入到当前结点〔*root〕的左孩子
if((*root)->
left==NULL&
&
(*root)->
key>
key){
parent=(*root);
left=p;
//插入到当前结点〔*root〕的右孩子
right==NULL&
key<
right=p;
key)
inseart(&
(*root)->
left,key);
elseif((*root)->
right,key);
else
}
//查找元素,找到返回关键字的结点指针,没找到返回NULL
PNodesearch(PNoderoot,KeyTypekey)
if(root==NULL)
returnNULL;
if(key>
root->
key)//查找右子树
returnsearch(root->
elseif(key<
key)//查找左子树
returnroot;
//查找最小关键字,空树时返回NULL
PNodesearchMin(PNoderoot)
if(root->
left==NULL)
else//一直往左孩子找,直到没有左孩子的结点
returnsearchMin(root->
left);
//查找最大关键字,空树时返回NULL
PNodesearchMax(PNoderoot)
right==NULL)
else//一直往右孩子找,直到没有右孩子的结点
returnsearchMax(root->
right);
//查找某个结点的前驱
PNodesearchPredecessor(PNodep)
//空树
if(p==NULL)
returnp;
//有左子树、左子树中最大的那个
if(p->
left)
returnsearchMax(p->
//无左子树,查找某个结点的右子树遍历完了
else{
parent==NULL)
//向上寻找前驱
while(p){
parent->
right==p)
break;
p=p->
parent;
returnp->
//查找某个结点的后继
PNodesearchSuccessor(PNodep)
//有右子树、右子树中最小的那个
right)
returnsearchMin(p->
//无右子树,查找某个结点的左子树遍历完了
//向上寻找后继
left==p)
//根据关键字删除某个结点,删除成功返回1,否那么返回0
//如果把根结点删掉,那么要改变根结点的地址,所以传二级指针
intdeleteNode(PNode*root,KeyTypekey)
PNodeq;
//查找到要删除的结点
PNodep=search(*root,key);
KeyTypetemp;
//暂存后继结点的值
//没查到此关键字
if(!
p)
return0;
//1.被删结点是叶子结点,直接删除
right==NULL){
//只有一个元素,删完之后变成一颗空树
parent==NULL){
free(p);
(*root)=NULL;
}else{
//删除的结点是父节点的左孩子
left=NULL;
else//删除的结点是父节点的右孩子
right=NULL;
//2.被删结点只有左子树
elseif(p->
left&
!
(p->
right)){
left->
parent=p->
//如果删除是父结点,要改变父节点指针
*root=p->
left;
//3.被删结点只有右孩子
right&
left)){
right->
right;
//4.被删除的结点既有左孩子,又有右孩子
//该结点的后继结点肯定无左子树(参考上面查找后继结点函数)
//删掉后继结点,后继结点的值代替该结点
//找到要删除结点的后继
q=searchSuccessor(p);
temp=q->
key;
//删除后继结点
deleteNode(root,q->
key);
key=temp;
return1;
//创立一棵二叉查找树
voidcreate(PNode*root,KeyType*keyArray,intlength)
inti;
//逐个结点插入二叉树中
for(i=0;
i<
length;
i++)
inseart(root,keyArray[i]);
intmain(void)
PNoderoot=NULL;
KeyTypenodeArray[11]={15,6,18,3,7,17,20,2,4,13,9};
create(&
root,nodeArray,11);
2;
deleteNode(&
root,nodeArray[i]);
printf("
%d\n"
searchPredecessor(root)->
searchSuccessor(root)->
searchMin(root)->
searchMax(root)->
search(root,13)->
}
图1:
二叉树排序实验结果