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

[数据结构]#6 树

树是一种非线性的数据结构,它由节点组成,并且这些节点之间通过边连接。树的每个节点可以有一个或多个子节点,并且有一个特殊的节点叫做根节点(没有父节点)。

树在计算机科学中应用广泛,尤其是在数据库索引、编译器设计和搜索算法等方面。

树的基本知识点


节点

包含数据以及指向其子节点的引用或链接。

连接两个节点之间的关系。

根节点

树的最顶端节点,唯一没有父节点的节点。

叶子节点

没有子节点的节点。

父节点与子节点

直接相连的上下层节点间的关系。

深度

从根到某个节点的路径长度。

高度

从某节点到叶子节点的最大路径长度。树的高度是指根节点的高度。

子树

由一个节点及其所有后代节点组成的树。

遍历

访问树中所有节点的过程,常见的遍历方法包括前序遍历、中序遍历、后序遍历和层次遍历。

常见类型的树

二叉树

每个节点最多有两个子节点。

二叉查找树(BST)

左子树上所有节点的值都小于它的根节点的值;右子树上所有节点的值都大于它的根节点的值。

平衡二叉树

如AVL树或红黑树,它们通过某些机制保持树的平衡,确保基本操作的时间复杂度为O(log n)。

一种特殊的完全二叉树,分为最大堆和最小堆。


具体的代码框架如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef char DATATYPE;
typedef struct BiTNode  /* 结点结构 */
{DATATYPE data;		/* 结点数据 */struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode;char dat[]="abd##eh###c#fi###";
int ind;void CreateTree(BiTNode**root)
{char c = dat[ind++];if('#'==c){*root = NULL;}else  {*root = malloc(sizeof(BiTNode));if(NULL == *root ){printf("malloc error\n");return ;}(*root)->data = c;CreateTree(& (*root)->lchild);CreateTree(& (*root)->rchild);}return ;
}/*** @brief  根左右   前序* * @param root */
void PreOrderTraverse(BiTNode*root)
{if(NULL==root ){return ;}else  {printf("%c",root->data);//root PreOrderTraverse(root->lchild);// liftPreOrderTraverse(root->rchild);// right}}
/*** @brief 左根右   中序* * @param root */
void InOrderTraverse(BiTNode* root)
{if(NULL == root){return ;}InOrderTraverse(root->lchild);printf("%c",root->data);InOrderTraverse(root->rchild);
}/*** @brief 左右根    后序* * @param root */
void PostOrderTraverse(BiTNode* root)
{if(NULL == root){return ;}PostOrderTraverse(root->lchild);PostOrderTraverse(root->rchild);printf("%c",root->data);
}void DestroyBiTree(BiTNode*root)
{if(NULL ==root){return ;}DestroyBiTree(root->lchild);DestroyBiTree(root->rchild);free(root);}int	main(int argc, char **argv)
{BiTNode* root=NULL;CreateTree(&root);PreOrderTraverse(root);printf("\n");InOrderTraverse(root);printf("\n");PostOrderTraverse(root);printf("\n");DestroyBiTree(root);// system("pause");return 0;
}
//层序遍历
#define MAX_QUEUE_SIZE 100typedef struct {BiTNode* data[MAX_QUEUE_SIZE];int front;int rear;
} Queue;// 初始化队列
void InitQueue(Queue* q) {q->front = 0;q->rear = 0;
}// 判断队列是否为空
int IsQueueEmpty(Queue* q) {return q->front == q->rear;
}// 入队
void EnQueue(Queue* q, BiTNode* node) {if ((q->rear + 1) % MAX_QUEUE_SIZE == q->front) {printf("Queue is full\n");return;}q->data[q->rear] = node;q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
}// 出队
BiTNode* DeQueue(Queue* q) {if (IsQueueEmpty(q)) {return NULL;}BiTNode* node = q->data[q->front];q->front = (q->front + 1) % MAX_QUEUE_SIZE;return node;
}// 层序遍历
void LevelOrderTraverse(BiTNode* root) {if (NULL == root) {return;}Queue queue;InitQueue(&queue);EnQueue(&queue, root);while (!IsQueueEmpty(&queue)) {BiTNode* node = DeQueue(&queue);if (node != NULL) {printf("%c", node->data);  // 访问当前节点EnQueue(&queue, node->lchild);  // 左孩子入队EnQueue(&queue, node->rchild);  // 右孩子入队}}
}

http://www.lryc.cn/news/597917.html

相关文章:

  • JVM Java虚拟机
  • 【Qt开发】信号与槽(一)
  • 机器学习入门指南它来了
  • LeetCodeOJ题:回文链表
  • Java学习----原型模式
  • vant-field 显示radio
  • 【Java】空指针(NullPointerException)异常深度攻坚:从底层原理到架构级防御,老司机的实战经验
  • 高级 JAVA 工程师卷 1
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-20,(知识点:热阻的概念,散热)
  • 专题:2025微短剧行业生态构建与跨界融合研究报告|附100+份报告PDF汇总下载
  • Python 使用环境下编译 FFmpeg 及 PyAV 源码(英特尔篇)
  • 第4章唯一ID生成器——4.1 分布式唯一ID
  • 中小企业安全落地:低成本漏洞管理与攻击防御方案
  • 深度分析Java内存模型
  • 企业级数据分析创新实战:基于表格交互与智能分析的双引擎架构
  • 【REACT18.x】CRA+TS+ANTD5.X实现useImperativeHandle让父组件修改子组件的数据
  • 赋能决策与创新的数据引擎:数据分析平台的价值与未来
  • 增强LLM最后隐藏层的意义与效果
  • 使用 MobaXterm 登录你的阿里云 ECS 实例
  • 常用的Typescript特性
  • python---元组(Tuple)
  • M3066ANL网络变压器,常用于NEC方案机顶盒等网络设备M3066AN实现网络信号的稳定传输与电气隔离保护
  • day 33打卡
  • 傅里叶转换(机器视觉方向)
  • 从 Shell 脚本到 Go 应用:使用 Kiro AI 助手完成 Harpoon 项目重构的完整实践
  • Android NDK与JNI深度解析
  • Day01_C++编程
  • 终端VS命令解释器(Linux Windows)
  • 算法牢笼与思想飞地:在人工智能时代守卫灵魂的疆域
  • 【使用TPCC和TPCH进行性能测试】