资源简介
代码里有二叉排序树插入操作递归算法,二叉排序树插入操作非递归算法,二叉排序树删除操作,创建二叉排序树,二叉排序树查找递归算法,二叉排序树查找非递归算法
代码片段和文件信息
#include
#include
typedef struct node
{
int key;
struct node *lchild*rchild;
}BSTNode;
//二叉排序树插入操作递归算法
BSTNode *InsertBST1(BSTNode *T int key)
{
BSTNode *p *q = T;
//p为待插入的新结点
p = (BSTNode *)malloc(sizeof(BSTNode));
p->key = key;
p->lchild = p->rchild = NULL;
if(T == NULL) //原树为空
T = p; //新插入的结点为新的根
//原树非空时将新结点p作为q的左孩子或右孩子插入
else
{
if(key == q->key)
return T;
if(key < q->key)
{
if(q->lchild ==NULL)
q->lchild = p;
else
InsertBST1(q->lchild key);
}
if(key > q->key)
{
if(q->rchild ==NULL)
q->rchild = p;
else
InsertBST1(q->rchild key);
}
}
return T;
}
////二叉排序树插入操作非递归算法
BSTNode *InsertBST2(BSTNode *T int key)
{
BSTNode *f *p = T;
//查找插入位置
while(p)
{
if(key == p->key)
return T;//无须插入
f = p;//记录访问的结点
if(key < p->key)
p = p->lchild;
else
p = p->rchild;
//若keykey,则在左子树中查找,否则在右子树中查找
}
//p为待插入的新结点
p = (BSTNode *)malloc(sizeof(BSTNode));
p->key = key;
p->lchild = p->rchild = NULL;
if(T == NULL) //原树为空
T = p; //新插入的结点为新的根
//原树非空时将新结点q作为p的左孩子或右孩子插入
else
{
if(key < f->key)
f->lchild = p;
else f->rchild = p;
}
return T;
}
//二叉排序树删除操作
void DelBST(BSTNode *Tint key)
{
BSTNode *p = T *f *q *s;
while(p)
{
if(p->key == key) break; //找到关键字为key的结点
f=p;//记下关键字key节点的父节点
p=(key < p->key)? p->lchild : p->rchild;//分别在*p的左、右子树中查找
}
if(!p) return;//二叉排序树中无关键字为key的结点
if(p->lchild == NULL && p->rchild == NULL)//p无左子树无右子树
{
if(p == T) T = NULL;//删除的是根节点
else
if(p == f->lchild)
f->lchild = NULL;
else
f->rchild = NULL;
}
else if(p->lchild == NULL && p->rchild != NULL)//p无左子树有右子树
{
if(f->lchild == p)
f->lchild = p->rchild;
else
f->rchild = p->rchild;
}
else if(p->rchild == NULL && p->lchild != NULL)//p有左子树无右子树
{
- 上一篇:C语言模拟ATM(结构体版)
- 下一篇:python wordcloud whl包
评论
共有 条评论