数据结构——二叉链表创建二叉树(C语言版)
数据结构——二叉链表创建二叉树
- 一、思想(先序思想创建):
- 二、创建二叉树
- (1)传一级参数方法
- (2)传二级参数方法
一、思想(先序思想创建):
第一步先创建根节点,然后创建根节点左子树,开始递归创建左子树,直到递归创建到的节点下不继续创建左子树,也就是当下递归到的节点下的左子树指向NULL,结束本次左子树递归,返回这个节点的上一个节点,开始创建右子树,然后又开始以当下这个节点,继续递归创建左子树,左子树递归创建完,就递归创建右子树,直到递归结束返回到上一级指针节点(也就是根节点下),此时根节点左边子树创建完毕,开始创建右边子树,原理和根节点左边创建左右子树相同
二、创建二叉树
二叉树的操作通常使用递归方法,如果递归不太明白,建议去对此进行一下学习和练习。二叉树的操作可以分为两类,一类是需要改变二叉树的结构的,比如二叉树的创建、节点删除等等,这类操作,传入的二叉树的节点参数为二叉树指针的地址,这种参入传入,便于更改二叉树结构体的指针(即地址)。这里稍微有一点点绕,可能需要多思考一下
- 如下是二叉数创建的函数,这里我规定,节点值为整数,如果输入的数为-1,则表示结束继续往下创建子节点的操作。然后我们使用递归的方法以此创建左子树和右子树
二叉树结构体初始化
为了更方便的使用二叉树结构体,可以使用 typedef 对结构体进行命名
typedef struct Tree{int data; // 存放数据域struct Tree *lchild; // 遍历左子树指针struct Tree *rchild; // 遍历右子树指针}Tree,*BitTree;
这里展示两种传参类型的创建方法,其中深意可多次参考理解,加深指针理解
(1)传一级参数方法
BitTree CreateLink()
{int data;int temp;BitTree T;scanf("%d",&data); // 输入数据temp=getchar(); // 吸收空格if(data == -1){ // 输入-1 代表此节点下子树不存数据,也就是不继续递归创建return NULL;}else{T = (BitTree)malloc(sizeof(Tree)); // 分配内存空间T->data = data; // 把当前输入的数据存入当前节点指针的数据域中printf("请输入%d的左子树: ",data); T->lchild = CreateLink(); // 开始递归创建左子树printf("请输入%d的右子树: ",data); T->rchild = CreateLink(); // 开始到上一级节点的右边递归创建左右子树return T; // 返回根节点} }
(2)传二级参数方法
BitTree CreateLink(BitTree *T) // 次数 T为指向根节点的指针的地址
{int data; scanf("%d",&data);if(data == -1){*T=NULL; // 结束递归时,让指针当前节点的指针地址的 指针 指向NULL}else{*T = (BitTree)malloc(sizeof(Tree)); // 对指向节点指针地址的指针 分配内存if(!(*T) ){ // *T = NULL 表示分配内存失败,也就是结束递归创建了printf("内存分配失败\n");exit(-1);}(*T)->data = data; // 给节点指针地址内的数据域,存入数据printf("请输入%d的左子树: ",data);CreateLink(&(*T)->lchild); // 开始遍历左子树printf("请输入%d的右子树: ",data);CreateLink(&(*T)->rchild); // 开始遍历右子树,遍历的思想文章开头处解释} }
(1)一级参数完整例子:
#include<stdio.h>
#include<stdlib.h>typedef struct Tree{int data; // 存放数据域struct Tree *lchild; // 遍历左子树指针struct Tree *rchild; // 遍历右子树指针}Tree,*BitTree;BitTree CreateLink()
{int data;int temp;BitTree T;scanf("%d",&data); // 输入数据temp=getchar(); // 吸收空格if(data == -1){ // 输入-1 代表此节点下子树不存数据,也就是不继续递归创建return NULL;}else{T = (BitTree)malloc(sizeof(Tree)); // 分配内存空间T->data = data; // 把当前输入的数据存入当前节点指针的数据域中printf("请输入%d的左子树: ",data); T->lchild = CreateLink(); // 开始递归创建左子树printf("请输入%d的右子树: ",data); T->rchild = CreateLink(); // 开始到上一级节点的右边递归创建左右子树return T; // 返回根节点} }void ShowXianXu(BitTree T) // 先序遍历二叉树
{if(T==NULL){return;}printf("%d ",T->data);ShowXianXu(T->lchild); // 递归遍历左子树ShowXianXu(T->rchild); // 递归遍历右子树
}int main()
{BitTree S;printf("请输入第一个节点的数据:\n");S = CreateLink(); // 接受创建二叉树完成的根节点ShowXianXu(S); // 先序遍历二叉树return 0;
}
(2)二级参数完整例子
#include<stdio.h>
#include<stdlib.h>
typedef struct Tree{int data;struct Tree *lchild;struct Tree *rchild;
}Tree,*BitTree;BitTree CreateLink(BitTree *T) // 次数 T为指向根节点的指针的地址
{int data; scanf("%d",&data);if(data == -1){*T=NULL; // 结束递归时,让指针当前节点的指针地址的 指针 指向NULL}else{*T = (BitTree)malloc(sizeof(Tree)); // 对指向节点指针地址的指针 分配内存if(!(*T) ){ // *T = NULL 表示分配内存失败,也就是结束递归创建了printf("内存分配失败\n");exit(-1);}(*T)->data = data; // 给节点指针地址内的数据域,存入数据printf("请输入%d的左子树: ",data);CreateLink(&(*T)->lchild); // 开始遍历左子树printf("请输入%d的右子树: ",data);CreateLink(&(*T)->rchild); // 开始遍历右子树,遍历的思想文章开头处解释} }void ShowXianXu(BitTree T) // 先序遍历二叉树
{if(T==NULL){return;}printf("%d ",T->data);ShowXianXu(T->lchild); // 遍历左子树ShowXianXu(T->rchild); // 遍历右子树
}int main()
{BitTree *S; // 创建指向这个结构体指针地址 的指针printf("请输入第一个节点的数据:\n");CreateLink(&S); // 传二级指针地址ShowXianXu(S); return 0;
}
数据结构——二叉链表创建二叉树(C语言版)相关推荐
- 利用二叉链表创建二叉树_利用递归解LeetCode第111题:二叉树的最小深度
题目描述(难度简单) 给定一个二叉树,找出其最小深度.最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,n ...
- 数据结构-二叉链表存储的二叉树(利用先序遍历)
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用.对于每一个结点至多只有两课子树的一类树,称其为二叉树.二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前序.中序遍历 ...
- 【数据结构】基于二叉链表的二叉树结点个数的统计
基于二叉链表的二叉树结点个数的统计 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别对二叉树的结点(度为0.1.2)个数进行统计. 输入 多组数据.每组数 ...
- 数据结构-二叉链表的结构与实现
目录 一.引言 二.什么是二叉链表 三.二叉链表的结构 四.二叉链表的实现 1. 创建二叉链表 2. 遍历二叉链表 3. 插入节点 4. 删除节点 五.应用场景 六.总结 七.代码示例 一.引言 数据 ...
- 3010基于二叉链表的二叉树高度的计算
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为'0'时,表示该结点为空).当输 ...
- 3003基于二叉链表的二叉树左右子树的交换
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法交换该二叉树的左右孩子. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为空) ...
- 基于二叉链表的二叉树高度的计算
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为'0'时,表示该结点为空).当输 ...
- 3006基于二叉链表的二叉树最长路径的求解(附思路)
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为 ...
- 3010基于二叉链表的二叉树高度的计算(附思路,WA的一种可能情况及代码)
基于二叉链表的二叉树高度的计算 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为 ...
- 二叉链表-创建、遍历(前序、中序、后序、非递归、层次)、复制、计算深度、结点数、销毁(C语言)
目录 二叉树的定义 二叉树的性质 二叉链表的基本操作 二叉链表的结构定义 前序遍历创建 前序.中序.后序遍历 中序遍历的非递归算法(栈) 层次遍历(队列) 复制二叉树 计算深度 计算总结点数与叶子结点 ...
最新文章
- 云原生解决什么问题?
- 骗子防不胜防,我们该如何安全上网?
- ai如何做倒角和圆角_石材路沿石是如何倒角的?倒角费用是多少?路沿石质量标准?...
- 3D集合图元:最小边界框/包围盒(boundingbox)
- java enum 报错_enum报错问题,求大神帮看下
- 【BZOJ2154】Crash的数字表格,数论练习之二维LCM(莫比乌斯反演)
- javascript 页面刷新
- can test 接收报文_CAN总线
- 结构体变量偏移量及大小计算
- 四阶龙格库塔法程序c语言,四阶龙格库塔法
- 关于计算机动画制作的过程,关于计算机制作动画的过程
- 初学者都能看懂的蒙特卡洛方法以及python实现
- C实现utf8与gbk互转
- Windows设备场景函数 - GetDC Ex
- 高射炮打蚊子丨用Visual Studio 2017写最初级的C语言程序
- Maven详解【Idea搭建Maven项目、Maven常用指令、Maven的传递性和依赖性、排除依赖】
- 深度学习要多深,才能读懂人话?|阿里小蜜前沿探索
- dependencyManagement和dependencies区别
- 课表插件timetable
- 前端面试题:如何画一条0.5px的线