当前位置: 首页 > news >正文

乡镇门户网站建设大连网络推广运营

乡镇门户网站建设,大连网络推广运营,旅游网站开发与建设论文,做公司网站流程平衡二叉树(Balanced Binary Tree)是一种二叉树,其中任意节点的两棵子树的高度差不超过 1。也可以说是一棵空树或者左右子树高度差不超过 1 的二叉树。 特点和性质 高度平衡:平衡二叉树是一种高度平衡的二叉树,任意节…

平衡二叉树(Balanced Binary Tree)是一种二叉树,其中任意节点的两棵子树的高度差不超过 1。也可以说是一棵空树或者左右子树高度差不超过 1 的二叉树。

特点和性质

  1. 高度平衡:平衡二叉树是一种高度平衡的二叉树,任意节点的左右子树高度差不超过 1。
  2. 高度复杂度:由于平衡性质,平衡二叉树的高度复杂度为 O(log n),其中 n 是树中节点的数量。
  3. 插入和删除操作效率高:由于平衡性质,插入和删除操作的平均时间复杂度也是 O(log n)。
  4. 查找操作效率高:在平衡二叉树中查找元素的时间复杂度也是 O(log n)。
  5. 常见实现:AVL 树和红黑树是常见的平衡二叉树实现。

平衡因子

在平衡二叉树中,每个节点的平衡因子是其左子树高度和右子树高度之差。平衡因子的取值范围通常为 {-1, 0, 1},表示左右子树的高度差为 -1、0 或 1。

平衡操作

当向平衡二叉树中插入或删除节点时,可能会破坏树的平衡性质,此时需要通过旋转操作来恢复平衡。常见的旋转操作包括左旋和右旋,以及它们的组合操作。

应用

平衡二叉树广泛用于需要高效的插入、删除和查找操作的场景,例如数据库索引、缓存实现等。

‘’’
下面代码实现了二叉树的平衡
以及删除 查找 4种遍历 draw
‘’’

main.c

#include<stdio.h>
#include<stdlib.h>#include<queue.h>	//已经被封装成动态库#define NAMESIZE	32struct score_st
{int id;char name[NAMESIZE];int math;int chinese;
};struct node_st
{struct score_st data;struct node_st *l,*r;
};static struct node_st *tree = NULL;//把tree提升到全局变量,当前文件static void print_s(struct score_st *d)
{printf("%d %s %d %d\n",d->id,d->name,d->math,d->chinese);
}int insert(struct node_st **root,struct score_st *data)
{struct node_st *node;if(*root == NULL){node = malloc(sizeof(*node));if(node == NULL)return -1;node->data = *data;node->l = NULL;node->r = NULL;*root = node;return 0;}if(data->id <= (*root)->data.id)return insert(&(*root)->l,data);elsereturn insert(&(*root)->r,data);
}
struct score_st *find(struct node_st *root,int id)
{if(root == NULL)return NULL;if(id == root->data.id)return &root->data;if(id < root->data.id)return find(root->l,id);elsereturn find(root->r,id);
}
void draw_(struct node_st *root,int level)
{int i;if(root == NULL)return ;draw_(root->r,level+1);for(i = 0;i<level;i++)printf("    ");print_s(&root->data);draw_(root->l,level+1);
}
void draw(struct node_st *root)
{draw_(root,0);printf("\n\n");//getchar();//相当于暂停
}static int get_num(struct node_st *root)
{if(root == NULL)return 0;return get_num(root->l) +1 +get_num(root->r);}static struct node_st *find_min(struct node_st *root)
{if(root->l == NULL)return root;return find_min(root->l);
}static void turn_left(struct node_st **root)
{struct node_st *cur = *root;*root = cur->r;cur->r = NULL;find_min(*root)->l = cur;//draw(tree);//测试语句
}static struct node_st *find_max(struct node_st *root)
{if(root->r == NULL)return root;return find_max(root->l);
}static void turn_right(struct node_st **root)
{struct node_st *cur = *root;*root = cur->l;cur->l = NULL;find_max(*root)->r = cur;//draw(tree);//测试语句
}void balance(struct node_st **root)//函数实现 先把伪代码写出来 ,梳理清楚整个的逻辑关系
{int sub;if(*root == NULL)return ;while(1){sub = get_num((*root)->l) -get_num((*root)->r);if(sub >= -1 && sub <=1)break;if(sub < -1)turn_left(root);elseturn_right(root);}balance(&(*root)->l);balance(&(*root)->r);
}void detele(struct node_st **root,int id)//删除一个节点 左边顶上来
{struct node_st **node = root;struct node_st *cur = NULL;while(*node != NULL && (*node)->data.id != id){if(id < ((*node)->data.id))&node = (*node)->l;else&node = (*node)->r;}if(*node == NULL)return ;cur = *node;if(cur->l == NULL)*node = cur->r;else{*node = cur->l;find_max(cur->l)->r = cur->r;}free(cur);
}#if 0
void travel(struct node_st *root)//先序遍历 根 左 右  中序遍历 左 根 右 后序遍历 后序遍历 左 右 根
{if(root == NULL)return ;print_s(&root->data);//travel(root->l);  	 //travel(root->l);travel(root->l);	//print_s(&root->data);  //travel(root->r);travel(root->r);	//travel(root->r);		 //print_s(&root->data)
}
#elsevoid travel(struct node_st *root)//借助之前封装好的queue库 
{int ret;QUEUE *qu;struct node_st *cur;qu = queue_create(sizeof(struct node_st *));if(qu == NULL)return ;queue_en(qu,&root);/*if error*/while(1){ret = queue_de(qu,&cur);if(ret == -1)break;print_s(&cur->data);if(cur->l !=NULL)queue_en(qu,&cur->l);if(cur->r !=NULL)queue_en(qu,&cur->r);}queue_deatroy(qu);
}#endifint main()
{int arr[] = {1,2,3,7,6,5,9,8,4};int i;struct score_st tmp,*datap;struct node_st *tree = NULL;for(i = 0;i<sizeof(arr)/sizeof(*arr);i++){tmp.id = arr[i];snprintf(tmp.name,NAMESIZE,"stu%d",arr[i]);tmp.math = rand()%100;tmp.chinese = rand()%100;insert(&tree,&tmp);}draw(tree);balance(&tree);draw(tree);travel(tree);#if 0	int tmpid = 5;delete(&tree,tmpid);draw(tree);
#endif#if 0
//测试语句int tmpid = 2;datap = find(tree,tmpid);if(datap == NULL)printf("can not find the id %d\n",tmpid);elseprint_s(datap);
#endifexit(0);
}
gcc main.c -lqueue -lllist -o main
./main

补充说明

对于 这样的函数参数 struct node_st **root

您的理解基本上是正确的,但是有一个小的修正。让我详细解释一下:

  • *root 是指向 struct node_st * 类型的指针。它存储了一个指向 struct node_st 类型的指针的地址。
  • 因此,**root 是一个 struct node_st 类型的结构体,因为它解引用了 *root,得到了一个指向 struct node_st 类型的指针,然后再次解引用这个指针,得到了 struct node_st 类型的实际结构体。

因此,root 是一个指向指针的指针,可以用来修改指针指向的内容,从而改变原始指针的值。这在函数中经常用于修改指针的指向,例如在函数中分配内存并将其地址存储在指针中。

http://www.yayakq.cn/news/285401/

相关文章:

  • 公司网站建设需要什么科目金华市建设监理协会网站
  • 如何做自己公司的网站制作ppt用什么软件免费
  • 大学两学一做网站呼和浩特市做网站公司好的
  • excel表如何做网站连接网站开发合同缴纳印花税吗
  • 十大小说网站排名兰州建设厅评职称网站
  • 网络公司经营范围网站建设网站建站建设多少钱
  • 广州建设网站公司哪家好抢注qq空间专属域名网站
  • 做导航网站赚钱制作小程序的流程
  • h5网站设计方案做视频网站违法么
  • 免费flash网站源码带后台注册公司做网站
  • 门户网站开发需求网页设计和网站设计
  • 服装公司网站模版舟山网络公司网站建设公司
  • 嘉兴网站建设科技有限公司福州seo关键字推广
  • 做外贸怎么登陆国外网站如何发布自己做的网站
  • 手机网站模版直播网站app开发
  • 网站建设带后台企业营销图片
  • 帝国cms下载站模板董家渡街道网站建设
  • 关于营销的网站有哪些自己的公网ip可以做网站
  • 网站备案期间做什么网站搭建系统
  • 网站优化要做哪些工作漳州网站建设哪家最正规
  • 买一个网站服务器多少钱口碑好的网站建设商家
  • 网站开发设计的技术免费网站qq抓取
  • 制作个人网站步骤中国室内设计师协会
  • 怎样在门户网站做网络推广中国空间站最新进展
  • 网站不备案做优化游戏币网站怎么做
  • 做网站设计怎么提升个人html网站
  • 河北地矿建设集团官方网站网销平台排名
  • 餐饮网站建设怎么建设的深圳广告公司联系方式电话
  • 做网站美工要学什么北京宏福建设有限公司网站
  • 站长之家网页模板wordpress 不同菜单