数据结构二叉排序树实验报告Word格式.docx

上传人:b****7 文档编号:22188947 上传时间:2023-02-03 格式:DOCX 页数:9 大小:15.88KB
下载 相关 举报
数据结构二叉排序树实验报告Word格式.docx_第1页
第1页 / 共9页
数据结构二叉排序树实验报告Word格式.docx_第2页
第2页 / 共9页
数据结构二叉排序树实验报告Word格式.docx_第3页
第3页 / 共9页
数据结构二叉排序树实验报告Word格式.docx_第4页
第4页 / 共9页
数据结构二叉排序树实验报告Word格式.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构二叉排序树实验报告Word格式.docx

《数据结构二叉排序树实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构二叉排序树实验报告Word格式.docx(9页珍藏版)》请在冰豆网上搜索。

数据结构二叉排序树实验报告Word格式.docx

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:

二叉树排序实验结果

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1