题目
一、 以下程序实现了二叉排序树的操作。完成如下功能:
(1) 由(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt 并以排号表示法输出;
(2) 判断bt 是否为一棵二叉排序树;
(3) 采用递归和非递归两种方法查找关键字为6 的结点,并输出其查找路径;
(4) 分别删除bt 中的关键字为4 和5 的结点,并输出删除后的二叉排序树。
ps:其实写的还是蛮水的,先pull上来,等忙过这一段时间再来修改
#include<stdio.h>
#include<stdlib.h>
#define num 10 //为二叉树的结点个数
typedef struct node{
int data;
struct node* lchild;
struct node* rchild;
}BSTreeOrg,*BSTree;
//在树中插入节点
int InsertBSTree(BSTree *bst,int data){
BSTree r,s,pre;
//创建节点
r = (BSTree)malloc(sizeof(BSTreeOrg));
r->data = data;
r->lchild = NULL;
r->rchild = NULL;
if(*bst == NULL)
{
*bst = r;
return 1;
}
pre = NULL;
s = *bst;
while(s){
if(s->data == data)
return 0;
//找到左侧或右侧的叶子结点
else if(data >(s->data))
{
pre = s;
s = s->rchild;
}
else{
pre = s;
s = s->lchild;
}
}
//当到叶子结点的时候,比较后创建新节点连到叶子节点后
if(data<pre->data)
pre->lchild = r;
else
pre->rchild = r;
return 1;
}
//创建排序二叉树
void CreateTree(BSTree *bst,int n){
int data,i;
*bst = NULL;
for(i = 0 ;i<n;i++){
scanf("%d",&data);
InsertBSTree(bst,data);
}
}
//查找关键字为6的结点
int NFindNode(BSTree bst,int findnumber)
{
BSTree findtree;
findtree = bst;
//非递归算法查找
while(findtree)
{
if(findtree->data == findnumber){
printf("%d ",findtree->data);
return 0;
}
if(findtree->data > findnumber){
printf("%d ",findtree->data);
findtree=findtree->lchild;
}
else{
printf("%d ",findtree->data);
findtree=findtree->rchild;
}
}
}
//查找递归算法
int FindNode(BSTree bst,int findnumber)
{
if(bst == NULL)
return 0;
BSTree findtree;
findtree = bst;
while(findtree)
{
if(findtree->data == findnumber){
printf("%d ",findtree->data);
return 0;
}
else if(findtree->data > findnumber)
{
printf("%d ",findtree->data);
return FindNode(findtree->lchild,findnumber);
}
else{
printf("%d ",findtree->data);
return FindNode(findtree->rchild,findnumber);
}
}
}
//查找方法大综合
int SumFind(BSTree Tree)
{
int m,choose=0;
printf("please enter the number you want to find: ");
scanf("%d",&m);
printf("please enter the number to choose the sorted way\n");
printf("1.recrusive find\n");
printf("2.non-recrusive find\n");
printf("you choose number is:");
scanf("%d",&choose);
if(choose == 1)
{
printf("you could catch the number by this way:");
return FindNode(Tree,m);
}
else if(choose == 2){
printf("you could catch the number by this way:");
return NFindNode(Tree,m);
}
else{
printf("please enter the right number");
return 0;
}
}
int delete(BSTree *p)
{
BSTree q,s;
if(!(*p)->lchild && (*p)->rchild)//只有一个节点的树
*p = NULL;
else if(!(*p)->lchild)
{//左子树为空
q = *p;
*p = (*p)->rchild;
free(q);
}
else if(!(*p)->rchild)
{//右子树为空
q = *p;
*p = (*p)->lchild;
free(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->rchild;
free(s);
}
return 1;
}
//删除算法
int DelTree(BSTree *bst,int n)
{
if(n == (*bst)->data)
delete(bst);
else if(n < (*bst)->data)
return DelTree(&(*bst)->lchild,n);
else
return DelTree(&(*bst)->rchild,n);
}
//中度优先遍历 递归法
void PrintBSTree(BSTree bst){
if(bst!= NULL)
{
PrintBSTree(bst->lchild);
printf("%d ",bst->data);
PrintBSTree(bst->rchild);
}
}
int main(){
int i,n;
BSTree Tree;
printf("please enter the BSTree's node data: \n");
CreateTree(&Tree,num);
printf("Sorted by LDR: \n");
PrintBSTree(Tree);
printf("\n");
SumFind(Tree);
printf("\n");
SumFind(Tree);
printf("\n");
for(i = 0;i<2;i++)
{
printf("please enter the number you want to delete:");
scanf("%d",&n);
DelTree(&Tree,n);
printf("The new BSTree after deleting: \n");
PrintBSTree(Tree);
printf("\n");
}
return 0;
}
程序运行截图:
2.请根据下述定义的数据结构,完成快速排序的程序。
//exp7-2.cpp
#include<stdio.h>
#define MAXE 20
typedef int KeyType;
typedef char InfoType[10];
typedef struct
{ KeyType key;
InfoType data;
}RecType;
......
所填写的部分
void QuickSort(RecType R[],int s,int t)
{
int i=s,j=t;
RecType temp;
if(i<j)
{
temp=R[s];
while(i!=j)
{
while(j>i && R[j].key>=temp.key)
--j;
R[i]=R[j];
while(j>i && R[i].key<=temp.key)
++i;
R[j]=R[i];
}
R[i]=temp;
QuickSort(R,s,i-1);
QuickSort(R,i+1,t);
}
}
......
void main()
{ int i,k,n=10;
KeyType a[]={9,8,7,6,5,4,3,2,1,0};
RecType R[MAXE];
for(i=0;i<n;i++)
R[i].key=a[i];
printf(“\n”);
printf(“ 初始关键字”);
for(k=0;k<n;k++)
printf(“%3d”,R[k].key);
QuickSort(R,0,n-1);
printf(“ 最后结果 ”);
for(k=0;k<n;k++)
printf(“%4d”,R[k].key);
printf(“\n\n”);
}
本文介绍了一种实现二叉排序树的操作方法,包括创建、查找和删除节点,并通过递归与非递归方式查找特定节点。同时,还提供了一个快速排序的实现示例。
872

被折叠的 条评论
为什么被折叠?



