当前位置:网站首页>排序二叉树代码
排序二叉树代码
2022-08-10 05:44:00 【牛奶还是纯的好】
#include<stdio.h>
// #include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int DataType;
typedef struct BST_node{
DataType data;
struct BST_node *lchild,*rchild;
}BST_T;
BST_T* Search_BST(BST_T** root,DataType key)
{
BST_T *p =*root;
while(p)
{
if(p->data==key) return p;
p=(key < p->data)?p->lchild:p->rchild;
}
return NULL;
}
void Insert_BST(BST_T** T,DataType data)
{
BST_T *p_bst =(BST_T*)malloc(sizeof(BST_T));
if(!p_bst) return;
p_bst->data =data;
p_bst->lchild=p_bst->rchild=NULL;
//empty tree
if((*T)==NULL)
{
*T = p_bst;
return;
}
//是否存在,已存在则返回,不插入
if (Search_BST(T, data) != NULL) return;
//insert
BST_T* tnode=NULL; BST_T *troot=(*T);
while(troot)
{
tnode = troot;
troot =(data<troot->data)? troot->lchild:troot->rchild;
}
if(data < tnode->data)
tnode->lchild =p_bst;
else
tnode->rchild =p_bst;
}
void CreateBST(BST_T** T,int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
Insert_BST(T,a[i]);
}
}
void MidOrderTraverse(BST_T* T)
{
if (T)
{
MidOrderTraverse(T->lchild);
//cout << T->data << " ";
printf("%d\t",T->data);
MidOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BST_T* T)
{
if (T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%d\t",T->data);
}
}
void PreOrderTraverse(BST_T* T)
{
if (T)
{
printf("%d\t",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void DeleteBSTNode(BST_T** root,DataType data)
{
BST_T *p = *root;
BST_T *parent =NULL;
BST_T *s =NULL;
if (!(*root)) return;
if(p->data == data)
{
//删除的是叶子节点
if(p->lchild==NULL && p->rchild==NULL)
*root =NULL;
//只有一个子节点
else if(!p->rchild&&p->lchild)
*root =p->lchild;
else if (!p->lchild&&p->rchild)
*root =p->rchild; //为了退出递归
//左子树右子树都有
else{
s = p->rchild;
//删除倒数第二层的节点
if(!s->lchild)
s->lchild =p->lchild;
//删除倒数第二层往上的节点
else{
while(s->lchild)
{
parent = s;
s= s->lchild;
}
parent->lchild =s->rchild;
s->lchild =p->lchild;
s->rchild = p->rchild;
}
(*root) = s;
}
free(p);
}
else if(data > p->data)
DeleteBSTNode(&(p->rchild),data);
else if(data < p->data)
DeleteBSTNode(&(p->lchild),data);
}
int main()
{
int arr[] = { 17,12,19,10,15,18,25,8,11,13,16,22};
BST_T *root =NULL;
CreateBST(&root,arr,12);
//printf("\nCreate BST: ");
// printf("\nMid order traverse: ");
// MidOrderTraverse(root);
printf("\npre order traverse: ");
PreOrderTraverse(root);
// printf("\npost order traverse: ");
// PostOrderTraverse(root);
//查找某节点
BST_T *result = Search_BST(&root, 12);
printf("查找结果:%d\n",result->data);
//删除二叉排序树中的节点12
DeleteBSTNode(&root, 8);
printf("\npre order traverse: ");
PreOrderTraverse(root);
// printf("\npost order traverse: ");
// PostOrderTraverse(root);
// printf("\n");
}边栏推荐
猜你喜欢
随机推荐
抛光树脂应用
Qt使用私有接口绘制窗口阴影
OpenGL学习笔记(LearnOpenGL)-第五部分 纹理
unity在UI界面上展示旋转模型
直接跳转与间接跳转
废酸回收再利用
Ingress Controller performance test(1)
Using parseInt() in TypeScript
分享一个专业TA的《Shader参考大全》
Unity扩展编辑器EditorWindow 小玩意(二)
Qt列表下方增加弹出加载数据提示效果
Talking about the realization idea of "frame" of "frame synchronization online game"
Unity object pool implementation
强化学习_08_Datawhale针对连续动作的深度Q网络
关于研究鼠标绘制平滑曲线的阶段总结
动态规划——从0-1背包问题到leetcode正则匹配
椭圆曲线离散对数问题以及求解
什么是代理ip?市面上好用的代理软件有哪些
How is C# hot update better than Lua?
虚幻5简单第三人称游戏制作文档









