二叉排序树
二叉排序树的定义:
二叉排序树(Binary Sort Tree)
空树or具有以下性质的二叉树
1>若左子树不空,则左子树上所有的结点小于根节点的值。
2>若右子树不空,则右子树上所有的结点大于根节点的值。
3>左右子树也分别是二叉排序树。
二叉排序树的特点:
中序遍历二叉树关键码有序
顺带一提关键码的定义:
关键码(Key)是数据结构(或记录)中某个数据项的值,用它可以标示一个数据元素(或记录)
关键码是在查找中的名词因此查找的定义便是:
查找(Searching)是指在含有n个数据元素的查找表中,找出关键码等于给定值kx的数据元素(或记录)
二叉排序树结点的定义如下:
typedef struct bistnode
{
datatype data;
struct bistnode *lchild,*rchild;
}BiSTNode,*BiSTree;
二叉排序树中插入一个结点:
BiSTree BST_InsertNode(BiSTree t,int kx)
{
BiSTNode *f,*p,*s;
p=t;
while(p)
{
if(kx==p->data)
{
printf("kx已存在,不需插入");
return(t);
}
else{
f=p;
if(kx<p->data) p=p->lchild;
else p=p->rchild;
}
}
s=(BiSTNode *)malloc(sizeof(BiSTNode));
s->data=kx;
s->lchild=NULL;
s->rchild=NULL;
if(!t) t=s;
else if(kx<f->data) f->lchild=s;
else f->rchild=s;
return t;
}
构造一棵二叉排序树:
BiSTree BST_Creat()
{
BiSTree t=NULL;
int kx;
scanf("%d",&kx);
while(kx!=0)
{
t=BST_InsertNode(t,kx);
scanf("%d",&kx);
}
return(t);
}
合在一起:
#include <stdio.h>
#include <stdlib.h>
int keydata[11]={63,90,70,55,67,42,98,83,10,45,58};
typedef int datatype;
typedef struct bistnode
{
datatype data;
struct bistnode *lchild,*rchild;
}BiSTNode,*BiSTree;
BiSTree BST_InsertNode(BiSTree t,int kx)
{
BiSTNode *f,*p,*s;
p=t;
while(p)
{
if(kx==p->data)
{
printf("kx已存在,不需插入");
return(t);
}
else{
f=p;
if(kx<p->data) p=p->lchild;
else p=p->rchild;
}
}
s=(BiSTNode *)malloc(sizeof(BiSTNode));
s->data=kx;
s->lchild=NULL;
s->rchild=NULL;
if(!t) t=s;
else if(kx<f->data) f->lchild=s;
else f->rchild=s;
return t;
}
BiSTree BST_Creat()
{
BiSTree t=NULL;
int kx,i=0;
while(i<11)
{
kx=keydata[i];
t=BST_InsertNode(t,kx);
i++;
}
return(t);
}
void PreOrderTraversal(BiSTree t)
{
if(t)
{
printf("%d ",t->data);
PreOrderTraversal(t->lchild);
PreOrderTraversal(t->rchild);
}
}
void MidOrderTraversal(BiSTree t)
{
if(t)
{
MidOrderTraversal(t->lchild);
printf("%d ",t->data);
MidOrderTraversal(t->rchild);
}
}
int main()
{
BiSTree t;
BiSTNode b;
t=BST_Creat();
MidOrderTraversal(t);
return 0;
}
测试运行结果:
既然是查找那一定就有对关键码进行查找操作的函数:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通