数据结构+二叉排序树+哈希表

一、问题一:实现二叉排序树的基本运算算法

 编写一个程序,包含二叉排序树的创建、查找和删除算法,并在此基础上编写 程序完成以下功能。

(1)由关键字序列(4, 9, 0, 1, 8, 6, 3, 5, 2, 7)创建一棵二叉排序树 bt 并以括号表示法输出。 (2)判断 bt 是否为一棵二叉排序树。(对二叉排序树来说,其中序遍历序列 为一个递增有序序列,因此,对 给定的二叉树进行中序遍历,如果始终能保持前一个值比后一个值小,则说明 该二叉树是一棵二叉排序树)

(3)采用递归和非递归两种方法查找关键字为 6 的结点,并输出其查找路径。

(4)分别删除 bt 中关键字为 4 和 5 的结点,并输出删除后的二叉排序树。

#include <stdio.h> 
#include <stdlib.h> 
typedef int KeyType; 
typedef int ElemType; 
typedef struct node 
{ KeyType key; 
 struct node *lchild,*rchild; 
}BSTNode; 
 
//插入单个数据 
BSTNode * InsertBST( BSTNode * bt,KeyType k) 
{ 
 if(bt==NULL)//原树为空 
 { bt=(BSTNode *)malloc(sizeof(BSTNode));//新建根节点 bt 
 bt->key=k;bt->lchild=bt->rchild=NULL; 
 } 
 else if(k<bt->key) 
 bt->lchild=InsertBST(bt->lchild,k);//递归插到左子树 
 else if(k>bt->key) 
 bt->rchild=InsertBST(bt->rchild,k);//递归插到右子树 
 return bt;//返回根节点 bt 
} 
//构建排序二叉树 
 BSTNode *CreateBST(KeyType a[],int n) 
 { 
 BSTNode *bt=NULL; 
 int i=0; 
 while(i<n)//循环将数值元素全部插入排序二叉树中 
 { bt=InsertBST(bt,a[i]); 
 i++; 
 } 
return bt; 
 } 
 
 //判断是否为排序二叉树 
 KeyType predt=-32767; 
 int judgeBST(BSTNode *bt) 
 {  int b1, b2; 
 if (bt==NULL) //空树是一棵二叉排序树 
 return 1; 
 else 
 { 
 b1=judgeBST(bt->lchild); //判断左子树 
 if(b1==0 || predt>=bt->key) 
 return 0; 
 predt=bt->key; //保存当前节点的关键字 
 b2=judgeBST (bt->rchild); //判断右子树 
 return b2; 
 } 
 } 
 
// 使用递归查找关键字为 6 的结点,并输出查找路径 
void SearchBST(BSTNode *bt,KeyType k) 
{ 
 printf(" %d",bt->key); 
 if(bt==NULL || bt->key==k){//递归出口 
 return ; 
 } 
 if(k<bt->key){ 
 SearchBST(bt->lchild,k);}//左子树递归查找 
 else 
 SearchBST(bt->rchild,k);//右子树递归查找 
} 
 
//使用非递归查找关键字为 6 的结点,并输出查找路径 
 void NRSearchBST(BSTNode *bt,KeyType k) 
{ B
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倚楼听风疏雨骤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值