博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉查找(搜索)树结点的插入,删除,旋转,广度和深度优先遍历
阅读量:2433 次
发布时间:2019-05-10

本文共 4458 字,大约阅读时间需要 14 分钟。

对下面代码的说明:

该代码的二叉树节点中含有三个指针,分别指向左儿子、右儿子、和父亲。函数接口包括,节点的插入函数,查找函数,树的前序遍历函数和广度优先遍历函数,二叉树节点的左旋和右旋函数。广度优先遍历利用了辅助队列,开辟在堆空间,因此还存在一个队列节点的删除函数。

#define _CRT_SECURE_NO_WARNINGS#include 
#include
typedef struct treenode{
int val; struct treenode* pparent; struct treenode* plchild; struct treenode* prchild;}treeNode_t, *pTreeNode_t;typedef struct quene{
pTreeNode_t InsertPos; struct quene* next;}Quene_t, * pQuene_t;void Insert_Node(pTreeNode_t* ppbstnode, int value); void PreOrder(pTreeNode_t pbstnode); pTreeNode_t Find_Node(pTreeNode_t pbstnode, int value);void rbtree_left_rotate(pTreeNode_t* ppbstnode, pTreeNode_t x);void rbtree_right_rotate(pTreeNode_t* ppbstnode, pTreeNode_t x);void BFS(pTreeNode_t pbstnode, pQuene_t* quehead, pQuene_t* quetail);void ClearQuene(pQuene_t* head);int main(){
int num; int value; pTreeNode_t ptr; pTreeNode_t proot = NULL; pQuene_t queHead = NULL, queTail = NULL; //50 40 60 35 45 55 65 测试数据 while (scanf("%d", &num) != EOF) {
Insert_Node(&proot, num); } PreOrder(proot); printf("\n"); BFS(proot, &queHead, &queTail); ClearQuene(&queHead); queHead = NULL; queTail = NULL; printf("\nwant to find value:\n"); scanf("%d", &value); ptr = Find_Node(proot,value); printf("it is %d\n", ptr->val); rbtree_left_rotate(&proot, ptr); BFS(proot, &queHead, &queTail); printf("\n"); ClearQuene(&queHead); queHead = NULL; queTail = NULL; ptr = Find_Node(proot, 65); rbtree_right_rotate(&proot, ptr); BFS(proot, &queHead, &queTail); printf("\n"); ClearQuene(&queHead); return 0;}void Insert_Node(pTreeNode_t* ppbstnode, int value){
pTreeNode_t p = *ppbstnode; pTreeNode_t pnew = (pTreeNode_t)malloc(sizeof(treeNode_t)); pnew->val = value; pnew->plchild = NULL; pnew->prchild = NULL; pnew->pparent = NULL; if (*ppbstnode == NULL) {
*ppbstnode = pnew; } else {
while (p) {
if (pnew->val < p->val) {
if (p->plchild == NULL) {
pnew->pparent = p; p->plchild = pnew; return; } p = p->plchild; } else {
if (p->prchild == NULL) {
pnew->pparent = p; p->prchild = pnew; return; } p = p->prchild; } } } return;}void PreOrder(pTreeNode_t pbstnode){
if (pbstnode) {
printf("%d ", pbstnode->val); PreOrder(pbstnode->plchild); PreOrder(pbstnode->prchild); }}void rbtree_left_rotate(pTreeNode_t* ppbstnode, pTreeNode_t x){
pTreeNode_t y = x->prchild; x->prchild = y->plchild; if (y->plchild != NULL) {
y->plchild->pparent = x; } y->pparent = x->pparent; if (x->pparent == NULL) {
*ppbstnode = y; } else {
if (x->pparent->plchild == x) {
x->pparent->plchild = y; } else {
x->pparent->prchild = y; } } y->plchild = x; x->pparent = y;}void rbtree_right_rotate(pTreeNode_t* ppbstnode, pTreeNode_t x){
pTreeNode_t y = x->plchild; x->plchild = y->prchild; if (y->prchild != NULL) {
y->prchild->pparent = x; } y->pparent = x->pparent; if (x->pparent == NULL) {
*ppbstnode = y; } else {
if (x->pparent->plchild == x) {
x->pparent->plchild = y; } else {
x->pparent->prchild = y; } } y->prchild = x; x->pparent = y;}pTreeNode_t Find_Node(pTreeNode_t pbstnode, int value){
while (pbstnode) {
if (value == pbstnode->val) {
return pbstnode; } else if (value < pbstnode->val) {
pbstnode = pbstnode->plchild; } else if (value > pbstnode->val) {
pbstnode = pbstnode->prchild; } else {
printf("Not Find this value.\n"); return NULL; } }}void BFS(pTreeNode_t pbstnode, pQuene_t* quehead, pQuene_t* quetail){
//pQuene_t head = *quehead; //pQuene_t tail = *quetail; pQuene_t quenew = (pQuene_t)calloc(1, sizeof(Quene_t)); if (NULL == *quehead) {
*quehead = quenew; *quetail = quenew; } pQuene_t head = *quehead; pQuene_t tail = *quetail; head->InsertPos = pbstnode; while (head) {
printf("%d ", head->InsertPos->val); if (head->InsertPos->plchild) {
pQuene_t quenew_left = (pQuene_t)calloc(1, sizeof(Quene_t)); quenew_left->InsertPos = head->InsertPos->plchild; tail->next = quenew_left; tail = quenew_left; } if (head->InsertPos->prchild) {
pQuene_t quenew_right = (pQuene_t)calloc(1, sizeof(Quene_t)); quenew_right->InsertPos = head->InsertPos->prchild; tail->next = quenew_right; tail = quenew_right; } head = head->next; }}void ClearQuene(pQuene_t* head){
pQuene_t ptr; while (*head) {
ptr = (*head)->next; free(*head); *head = ptr; }}

转载地址:http://xxxmb.baihongyu.com/

你可能感兴趣的文章
盛食厉兵 中科天玑挖掘大数据价值助力行业数字化转型
查看>>
白鹭引擎正式支持微信小游戏开发
查看>>
2018年,你所不知道的Jira!
查看>>
2017年,阿里巴巴开源的那些事
查看>>
推动边缘计算的七项核心技术
查看>>
边缘计算精华问答 | 边缘计算需要IaaS、PaaS、SaaS等服务能力吗?
查看>>
Spark精华问答 | Spark 会替代Hadoop 吗?
查看>>
豆瓣已玩烂,来爬点有逼格的 ——IMDB 电影提升你的品位
查看>>
一部刷爆朋友圈的5G短片,看完才知道5G多暖多重要!
查看>>
SDN精华问答 | SDN可以做什么?
查看>>
云评测 | 开发者最有用的开源云监控工具有哪些呢? 这7款神器总有一款适合你!...
查看>>
小团队的微服务之路
查看>>
K8S精华问答 | Kubernetes集群不能正常工作,难道是防火墙问题?
查看>>
5G精华问答 | 什么是5G?5G与LTE有什么关系?
查看>>
虎牙直播在微服务改造方面的实践和总结
查看>>
微服务精华问答 | 在使用微服务架构时,您面临哪些挑战?
查看>>
Kubernetes 调度器实现初探
查看>>
边缘计算精华问答 | 边缘计算有哪些应用场景?
查看>>
数据中台精华问答 | 数据中台和传统数仓的区别是什么?
查看>>
如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招
查看>>