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

完全二叉树的链式创建以及遍历

树是一种非常重要的数据结构,在我们的日常生活中有着非常多的应用,而二叉树是树中一种比较常见的结构,关于二叉树的创建,之前我们讲过顺序存储,现在将完全二叉树的链式存储的创建分享给大家

思想:完全二叉树的思想利用了层次遍历的思想,已经队列的辅助来创建,当我们创建根结点需要建立左右孩子结点的时候,只需要把根结点入队,根据出队的结点来判断左右孩子是否为空,再创建左右孩子结点

1.初始化一个辅助队列

2.根结点入队

3.若队列非空,则队头结点出队,并访问该结点,将其左,右孩子插入入队(如果有的话)

4.重复3直至队列为空

具体代码如下:

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
//设计树
typedef struct TreeNode
{
int data;
struct TreeNode* Lchild, * Rchild;//左孩子和右孩子
}TreeNode,*Tree;
//设计队列
typedef struct LinkNode//队列的结点
{
TreeNode* data;//数据域--其实存的是树中结点的指针
struct LinkNode* next;//指针域--指向下一个结点
}LinkNode;
typedef struct SQueue//队列
{
LinkNode* front, * rear;//首指针和尾指针
}SQueue;
void InitTree(Tree* T)//初始化树
{
(*T) = NULL;
return;
}
void InitSQueue(SQueue* Q)//初始化队
{
Q->front = Q->rear = (LinkNode*)malloc(sizeof(LinkNode));//令首结点和尾结点指向头结点
if (Q->front == NULL)
return;//创建失败
Q->front->next = NULL;
}
bool EnQueue(SQueue* Q, TreeNode* temp)//入队
{
//链式存储无需判断是否满
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
if (s == NULL)
return false;//内存分配失败
s->data = temp;//树结点
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
return true;
}
bool DeQueue(SQueue* Q, TreeNode** temp)//出队
{
if (Q->front == Q->rear)
return false;//空队无法出队
LinkNode* s = Q->front->next;
*temp = s->data;
Q->front->next = s->next;
if (s == Q->rear)//最后一个元素
Q->rear = Q->front;
free(s);
return true;
}
bool EmptyQueue(SQueue Q)//判断空队
{
if (Q.front != Q.rear)
return false;//头指针不等于尾指针
return true;
}
void visit(TreeNode* temp)//打印树结点
{
if (temp == NULL)
return;//无数据元素
printf("%d ", temp->data);
}
bool EnTree(Tree* T, int start, int end)//增加结点
{
if (start < 0 || end > 12)
return false;//输入错误
//创建根结点
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
if (root == NULL)
return false;//内存分配失败
root->data = start;
root->Lchild = NULL;
root->Rchild = NULL;
start++;//初始+1
(*T) = root;
//创建后续结点
SQueue Q;//声明队列
InitSQueue(&Q);//初始化队列
TreeNode* temp = NULL;
//根结点入队
EnQueue(&Q, root);
//创建子节点
while (start <= end && !EmptyQueue(Q))//小于等于12并且Q非空
{
DeQueue(&Q,&temp);//出队
//visit(temp);//打印出根结点
if (start <= end && temp->Lchild == NULL)//插入左孩子
{
TreeNode* LSon = (TreeNode*)malloc(sizeof(TreeNode));
if (LSon == NULL)
return false;//分配失败
temp->Lchild = LSon;//根结点指向左孩子
LSon->data = start;
LSon->Lchild = NULL;
LSon->Rchild = NULL;
start++;
EnQueue(&Q, LSon);//左孩子入队
}
if (start <= end && temp->Rchild == NULL)//插入右孩子
{
TreeNode* RSon = (TreeNode*)malloc(sizeof(TreeNode));
if (RSon == NULL)
return false;//分配失败
temp->Rchild = RSon;
RSon->data = start;
RSon->Lchild = NULL;
RSon->Rchild = NULL;
start++;
EnQueue(&Q, RSon);//右孩子入队
}
}
return true;
}
void PreTra(Tree T)//先序遍历树结点(递归方法)
{
if (T != NULL)
{
visit(T);//打印根结点
PreTra(T->Lchild);//遍历左结点
PreTra(T->Rchild);//遍历右结点
}
}
void Infix(Tree T)//中序遍历树结点(递归方法)
{
if (T != NULL)
{
Infix(T->Lchild);//遍历左结点
visit(T);//打印根结点
Infix(T->Rchild);//遍历右结点
}
}
void Last(Tree T)//后续遍历
{
if (T != NULL)
{
Last(T->Lchild);
Last(T->Rchild);
visit(T);
}
}
int main()
{
//假设完全二叉树从1到12
int start = 1;
int end = 12;
Tree T;//指向树的指针
InitTree(&T);//初始化树
EnTree(&T, start, end);//在树中插入数据
PreTra(T);
printf("\n");
Infix(T);
printf("\n");
Last(T);
return 0;
}

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

相关文章:

  • 数据结构——二叉树和BST(2)
  • 一文解码百度地图ETA
  • 好题推荐-剑指S10
  • Python 中的魔术方法(Magic Methods)
  • JavaScript事件循环机制----event loop
  • C++编程学习(第33天)
  • 伺服上位机展示
  • Class62 优化算法
  • 电气专业科研怎么入门?电气仿真入门秘籍
  • 软考-系统架构设计师 基于构件的软件工程详细讲解
  • MCP 项目标准管理工具 v1.1.0 发布:新增 API 调试功能,助力 AI 辅助开发标准化
  • Linear Algebra in Competitive Programming
  • Decision Trees vs Neural Networks|决策树 vs 神经网络
  • FreeRTOS——任务管理
  • MSXML4.0是什么?下载安装+常见错误修复一网打尽
  • Claude Code生态
  • Node v22.19 Nest.js 安装 better-sqlite3
  • Android compose Room Sqlite 应用 (注入式)
  • 缓存穿透+缓存雪崩+缓存击穿(解决方法+实战)
  • Docker技术相对于虚拟机技术的优劣势对比!
  • MyBatis框架与参数详解
  • Confluent-Kafka-go 发布超过 1M 消息失败问题解决
  • 数字图像处理-函数矩阵
  • 基于 ST-Link 和 MDK-Keil 的 STM32 程序下载实验
  • 安防监控系统的架构与组成原理
  • 【前端】【threeJs】前端事件偏移问题完整总结
  • web:ts的类型兼容性
  • 黑盒测试:测试用例设计之场景法(流程图法)(模拟用户实际使用软件的场景来设计测试用例,适用于业务流程复杂的系统测试)基本流、备选流
  • Django + Vue3 前后端分离技术实现自动化测试平台从零到有系列 <第二章> 之 平台功能架构整理
  • 神经网络学习笔记14——高效卷积神经网络架构EfficientNet