从头来过----- 层次建树(完全二叉树)

层次建树 准备工作(树 是逻辑结构)

层次建树需要树结点,还需要一个队列帮忙存储、标识、增添、移动

树结点

每个树结点,都需要一个地方存储元素,并且有一个左结点指针和一个右结点指针

//树结点的结构体
typedef struct BiTNode {BiTreeType c;//树中存储的数据类型 数据结构中写的是datastruct BiTNode* LChild;//左孩子指针struct BiTNode* RChild;//右孩子指针
}BiTNode, *BiTree;

队列结点

用链式存储创建队列 FIFO 里面存储的元素为树结点的指针,和下一个队列结点的指针

//队列的结构体
typedef struct tag {BiTree p;//数的某一个结点的地址struct tag* next;//指向队列下一个结点的指针
}tag_t, * Ptag_t;

开始建树

层次建树辅助图像

1、初始化 树 和 辅助队列

//①初始化 树 和 辅助队列BiTree tree=NULL;//定义一个树结点指针 此时为空树Ptag_t Phead, Ptail, Pcur, ListPnew;//Phead 指向队列头的指针 Ptail指向队列尾的指针 Pcur指向当前被插入(根)的指针//ListPnew 生成的队列Phead = Ptail = Pcur=NULL;//队列为空时,队头指针和队尾指针指向也为空BiTree Pnew;//要插入的树结点元素

2、将元素插入树和队列中

用于接收控制台传来的数据

BiTreeType c;//存储要插入的元素 abcdefghij

循环从控制台上获取数据 并插入树和辅助队列

while (scanf("%c", &c) != EOF) {//scanf函数返回的值是 正确输入参数的个数 0 表示用户输入不匹配//EOF是一个计算机术语,为End Of File的缩写 值为-1//字符的ASCII代码值的形式存放 ASCII代码值的范围是0~127,不可能出现-1//即获取数据有效if (c == '\n') {break;//跳出循环}

为新插入的树结点和队列结点申请空间,并将数据存入

Pnew = (BiTree)calloc(1, sizeof(BiTNode));//为要插入的树结点指针再内存中申请空间//calloc函数和malloc函数的区别: // ①参数不同 malloc 需要自己进行空间大小的× malloc(sizeof(BitNode)*1);//calloc 只需要将需要的空间个数输入即可//② calloc 函数申请的内存空间会自动将内存中的数据置0 //malloc 不会 默认是ccccccccListPnew = (Ptag_t)calloc(1, sizeof(tag_t));//为队列结点指针再内存中申请空间//将传入数据存储进 插入的树结点 和 插入的队列结点中Pnew->c = c;//存入树结点ListPnew->p = Pnew;//存入队列结点

**注意:为新插入结点指针申请空间时,不能再循环外面申请,因为再循环外面申请时,每次新的循环开始,传入参数赋值,所更改的都是最初申请指针所指向位置里的内容, 且树、队列结点指针都会随着每一次的更改 而更改------------牵一发而动全身!!!!!

当树为空树时:

将插入的树结点作为树的根
将插入的队列结点作为队列的第一个元素
队列头和队列尾都指向该元素
当前操作的结点也指向第一个队列元素
跳出第一次的循环

if (NULL == tree) {//树为空时tree = Pnew;//新插入的结点就应该为树的根Phead = Ptail = ListPnew;//辅助队列的队列头指针和队列尾指针就应该都指向新插入的结点Pcur = ListPnew;//当前操作的结点也应该指向新插入的结点continue;//跳出此次循环}

树不为空时

先将插入元素 插入至辅助队列 (使用尾插法)

else {//不为空树时//先将元素插入辅助队列Ptail->next = ListPnew;//辅助队列尾插入结点Ptail = ListPnew;//队列尾指针指向新插入元素}

再判断 当前操作结点的左结点是否为空
左结点为空将要插入的树结点插入至当前结点的左结点

if (NULL == Pcur->p->LChild) {//当前操作的结点的左结点为空时Pcur->p->LChild = Pnew;//新插入元素插入当前操作结点的左结点}

当前操作结点的右结点为空时
将要插入的的树结点插入至当前结点的右结点
此时当前操作的结点左右结点都已经存入元素
将当前操作结点指向辅助队列中他的下一结点

else if (NULL == Pcur->p->RChild) {//当前操作结点的右结点为空时Pcur->p->RChild = Pnew;//新插入元素插入当前操作结点的右结点Pcur = Pcur->next;//当前操作结点的左右结点都已经插入完毕,指向下一个要被操作的根节点}

建成的完全二叉树样子:

输入字符为:abcdefghij

全代码展示

//20221227 层次建树 (完全二叉树)//定义一个二叉树中的数据类型 char 起别名
typedef char BiTreeType;
//树结点的结构体
typedef struct BiTNode {BiTreeType c;//树中存储的数据类型 数据结构中写的是datastruct BiTNode* LChild;//左孩子指针struct BiTNode* RChild;//右孩子指针
}BiTNode, *BiTree;
//队列的结构体
typedef struct tag {BiTree p;//数的某一个结点的地址struct tag* next;//指向队列下一个结点的指针
}tag_t, * Ptag_t;int main() {//20221227 层次建树 (完全二叉树)//层次建树需要树结点,还需要一个队列帮忙存储、标识、增添、移动//①初始化 树 和 辅助队列BiTree tree=NULL;//定义一个树结点指针 此时为空树Ptag_t Phead, Ptail, Pcur, ListPnew;//Phead 指向队列头的指针 Ptail指向队列尾的指针 Pcur指向当前被插入(根)的指针//ListPnew 生成的队列Phead = Ptail = Pcur=NULL;//队列为空时,队头指针和队尾指针指向也为空BiTree Pnew;//要插入的树结点元素BiTreeType c;//存储要插入的元素 abcdefghij//② 插入树和队列中 while (scanf("%c", &c) != EOF) {//scanf函数返回的值是 正确输入参数的个数 0 表示用户输入不匹配//EOF是一个计算机术语,为End Of File的缩写 值为-1//字符的ASCII代码值的形式存放 ASCII代码值的范围是0~127,不可能出现-1//即获取数据有效if (c == '\n') {break;//跳出循环}//申请空间存入数据Pnew = (BiTree)calloc(1, sizeof(BiTNode));//为要插入的树结点指针再内存中申请空间//calloc函数和malloc函数的区别: // ①参数不同 malloc 需要自己进行空间大小的× malloc(sizeof(BitNode)*1);//calloc 只需要将需要的空间个数输入即可//② calloc 函数申请的内存空间会自动将内存中的数据置0 //malloc 不会 默认是ccccccccListPnew = (Ptag_t)calloc(1, sizeof(tag_t));//为队列结点指针再内存中申请空间//将传入数据存储进 插入的树结点 和 插入的队列结点中Pnew->c = c;//存入树结点ListPnew->p = Pnew;//存入队列结点if (NULL == tree) {//树为空时tree = Pnew;//新插入的结点就应该为树的根Phead = Ptail = ListPnew;//辅助队列的队列头指针和队列尾指针就应该都指向新插入的结点Pcur = ListPnew;//当前操作的结点也应该指向新插入的结点continue;//跳出此次循环}else {//不为空树时//先将元素插入辅助队列Ptail->next = ListPnew;//辅助队列尾插入结点Ptail = ListPnew;//队列尾指针指向新插入元素}//不为空树时 再将元素插入树if (NULL == Pcur->p->LChild) {//当前操作的结点的左结点为空时Pcur->p->LChild = Pnew;//新插入元素插入当前操作结点的左结点}else if (NULL == Pcur->p->RChild) {//当前操作结点的右结点为空时Pcur->p->RChild = Pnew;//新插入元素插入当前操作结点的右结点Pcur = Pcur->next;//当前操作结点的左右结点都已经插入完毕,指向下一个要被操作的根节点}}return 0;
}

代码建树结果展示

树从根开始的每个左结点

树从根开始的每个右结点

数据结构---------层次建树(完全二叉树)相关推荐

  1. C语言数据结构之二叉树的层次建树及遍历方法(前序,中序,后序,层次遍历)

    C语言数据结构之二叉树的层次建树及遍历方法(前序,中序,后序,层次遍历) tips:前些天学习了C语言数据结构链表,栈,队列.今天来学习一下C语言数据结构之二叉树的各种操作. 注意:二叉树的层次建树是 ...

  2. 数据结构-二叉树(包含二叉树的层次建树、前中后序遍历、层次遍历解析及代码)

    目录 一.树与二叉树的原理解析 1.树的定义 2.树的结构和特点 3.二叉树的定义 4.树结点的数据结构 二.二叉树的层次建树 1.二叉树层次建树的原理及分析 2.完整代码 三.二叉树的前中后序遍历 ...

  3. 【代码 C/C++】二叉树层次建树

    目录 正式开始打代码前的一些小知识 辅助队列 calloc和malloc 代码部分 结构体 二叉树建树 打代码时发现的关于BiTNode和BiTree一些注意点(其实很简单但好久才想明白 正式开始打代 ...

  4. C++ 二叉树的层次建树及其遍历

    总结归纳 先序遍历:根左右:中序遍历:左根右:后序遍历:左右根. 若选取层次建树,则需要一个链式队列辅助实现 (规定,不必问为什么) .若选取层次遍历,也需要一个链式队列辅助实现. 该辅助队列的具体操 ...

  5. 数据结构-二叉树、完全二叉树、森林等(基础讲解)

    1.基本术语: 度:有两种度"结点的度"与"树的度".结点的度指的是一个结点子树的个数:树的度是指树中结点度的最大值. 叶子结点:指的是没有子树的结点. 层:树 ...

  6. java数据结构创建树_在java中创建树数据结构?

    我试图在 java中创建一个树数据结构,其中每个父节点只能有三个子节点,但在节点至少有一个子节点但少于3个子节点的情况下,我一直坚持在树上添加一个节点.我不确定是否应该使用迭代器来迭代我当前节点的节点 ...

  7. 数据结构--顺序表、链表、栈、队列、树、文件(visual studio可运行)

    顺序表的顺序存储(增删查) #include <stdio.h> #include <stdlib.h> #define MaxSize 50 typedef int Elem ...

  8. 数据结构:完全二叉树开胃菜小练习

    目录 一.前言 二.完全二叉树的重要结构特点 三.完全二叉树开胃菜小练习 1.一个重要的数学结论 2.简单的小练习 一.前言 关于树及完全二叉树的基础概念(及树结点编号规则)参见:http://t.c ...

  9. 数据结构——左子右兄二叉树

    此为本人在学习数据结构时所写的,各个功能能够实现,有main,danyuan.h,danyuan.cpp四个文件,使用说明如下: 在输入的时候要将所有的数据单元都输入,哪怕是空节点,如对于树: A B ...

最新文章

  1. 转 [JAVA] 使用 common-fileupload 实现文件上传
  2. 如何利用输入输出流往文件中不断添加内容
  3. Win或Linux系统下用conda安装Open Babel
  4. Nifi出现Failed to send StandardFlowFileRecord xxxx to Hbase due to Failed 3 actions解决
  5. angularjs php 实例下载,AngularJS Eclipse 1.2.0 插件下载
  6. php 备份数据库(生成word,excel,json,xml,sql)
  7. word中的图片设定成统一文字环绕格式
  8. Oracle11g安装完成后给用户解锁
  9. C# 获得当前运行程序所在的目录的代码
  10. word单元格调整文字行间距
  11. 12面魔方公式图解法_三阶魔方公式符号图解V2.0(2017/12/15)_碧海风云
  12. 如何在HTML标题中添加或改变图片
  13. se78 上传图片(logo使用)/SWM0上传文件
  14. 四级语法4——定语从句
  15. 使用veil进行木马生成
  16. CreateEvent的理解
  17. Retrofit框架简单学习使用(举例:酷狗搜索和歌曲详情接口)
  18. 托管IDC 机房的的几点优势
  19. 计算机系统喇叭发生警报,电脑开机有报警声怎么回事
  20. GPU的并行运算与CUDA的简介

热门文章

  1. 温州大学计算机学硕考研难度,温州大学研究生院,温州大学考研难度?
  2. Vue-Cli3 MPA
  3. zoj 1974 || poj 1940 Polygon Programming with Ease
  4. 快速搭建springcloud项目
  5. 手机端口号怎么查看_手机文件怎样快速传输到电脑
  6. 原来PCB铝基板竟也有这么多种类,你都知道吗?
  7. LTE-下行MCS/NPRB的调度和分配
  8. 【计算机网络】【运输层-4】
  9. 常用的表格检测识别方法——表格内容识别方法
  10. ORA-01103: database name 'test' in control file is not 'standby'