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

二叉树实现堆,咕咕咕

1.

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef char BT;
typedef struct BTNode
{BT data;struct BTNode* left;struct BTNode* right;
}BTNode;
//已知一个数组arr
BTNode* BTtreecreate(BT* a,int n,int* p)
{//'#'表示空节点用p指针是因为接下来要调用函数,要用同一个p,并不是分开的pif(*p>=n||a[*p]=='#'){(*p)++;//移动到下一个位置return NULL;}BTNode* btnode=(BTNode*)malloc(sizeof(BTNode));assert(btnode!=NULL);btnode->data=a[*p];(*p)++;BTtreecreate(a,n,p);BTtreecreate(a,n,p);return btnode;
}
//销毁
void BTtreedestroy(BTNode** root)
{if(root==NULL||*root==NULL) return;BTtreedestroy(&((*root)->left));BTtreedestroy(&((*root)->right));free(*root);*root=NULL;
}
//节点个数
int BTnodesize(BTNode* root)
{if(root==NULL) return 0;return 1+BTnodesize(root->left)+BTnodesize(root->right);
}
//叶子的个数
int BTleavesize(BTNode* root)
{
if(root==NULL) return 0;
if(root->left==NULL&&root->right==NULL)
{return 1;
}
return BTleavesize(root->left)+BTleavesize(root->right);
}
//第k层结点的个数
int BTksize(BTNode* root,int k)
{
if(root==NULL||k<=0) return 0;
if(k==1) return 1;
return BTksize(root->left,k-1)+BTksize(root->right,k-1);
}
//找x的结点
BTNode* BTfindx(BTNode* root,BT x)
{if(root==NULL) return NULL;if(root->data==x) return root;BTNode* leftresult=BTfindx(root->left,x);if(leftresult!=NULL) return leftresult;return BTfindx(BTNode* root->right);
}
//二叉树前序遍历
void BTpreorder(BTNode* root)
{if(root==NULL) return;printf("%c",root->data);BTpreorder(root->left);BTpreorder(root->right);
}
//二叉树中序遍历
void BTinorder(BTNode* root)
{if(root==NULL) return;BTinorder(root->left);printf("%c",root->data);BTinorder(root->right);
}
//二叉树后序遍历
void BTpostorder(BTNode* root)
{if(root==NULL) return;BTpostorder(root->left);BTpostorder(root->right);printf("%c",root->data);
}
//层序遍历
void BTlevelorder(BTNode* root)
{if(root==NULL) return;Queue q;QueueInit(q);Queuepush(&q,root);while(!Queueempty(q)){BTNode* current=QueuePop(&q);printf("%c",current->data);if(current->left!=NULL) Queuepush(&q,current->left);if(current->right!=NULL)Queuepush(&q,current->right);}
}
//判断是否完全二叉树
int iscomplete(BTNode* root)
{//根结点先入队列,保证队列不为空//循环判断队列是否为空,不为空取对头,出对头,把对头结点的左右孩子全部入队列//取到空的对头,跳出循环,判断剩下是否全部为空结点Queue q;QueueInit(q);Queupush(&q,root);while(!QueueEmpty(&q)){BTNode* top=QueueFront(&q);QueuePop(&q);if(top==NULL){break;}Queuepush(&q,top->left);Queuepush(&q,top->right);}
while(!QueueEmpty(&q))
{BTNode* top=QueueFront(&q);QueuePop(&q);if(top!=NULL){QueueDestroy(&q);return false;}
}
QueueDestroy(&q);
return true;
}

2.二叉树的题目(未完待续)

性质:二叉树0度结点n0个,2度结点n2个,则n0=n2+1

(a个2度,b个1度,c个0度(叶节点),边数2a+b(所有的子节点数,度数代表子节点数),边数也是a+b+c-1(总结点数-1),所以a=c-1)

http://www.dtcms.com/a/291555.html

相关文章:

  • 【Windows】多标签显示文件夹
  • 【世纪龙科技】数字课程资源-新能源汽车概论
  • 《Linux 环境下 Nginx 多站点综合实践:域名解析、访问控制与 HTTPS 加密部署》​
  • 电脑 CPU、GPU 版本知识详解及查看方法
  • xformers包介绍及代码示例
  • 力扣刷题 -- 100.相同的树
  • 计算机组成原理——数据的表示与运算1
  • 【vector 迭代器用法】ans.end()[-1]
  • 如何使用Ansible一键部署Nacos集群?
  • Sentinel-2 卫星 轨道编号及数据下载
  • 影刀 RPA:批量修改 Word 文档格式,高效便捷省时省力
  • Unity 渲染管线详解与实战分析
  • ANSYS 2025 R1软件下载及安装教程|附安装文件
  • 数据结构之克鲁斯卡尔算法
  • GeoTools 自定义坐标系
  • React基础(1)
  • RS485和Modbus
  • Python 基础语法与数据类型(十五) - 异常处理
  • 把sudo搞坏了怎么修复:报错sudo: /etc/sudo.conf is owned by uid 1000, should be 0
  • 小孙学变频学习笔记(十一)关于V/F曲线的讨论
  • vue3+element-plus,el-autocomplete远程搜索,解决下拉框闪一下的问题
  • 概率论与数理统计(八)
  • Java IO 流详解:从基础到实战,彻底掌握输入输出编程
  • 自定义命令行解释器shell
  • Android开发中Crash治理方案
  • C++中的detach
  • Python打卡Day20 常见的特征筛选算法
  • C 语言的指针复习笔记
  • 圆柱电池自动分选机:全流程自动化检测的革新之路
  • 大模型中的Actor-Critic机制