数据结构——二叉链表创建二叉树

  • 一、思想(先序思想创建):
  • 二、创建二叉树
    • (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语言版)相关推荐

  1. 利用二叉链表创建二叉树_利用递归解LeetCode第111题:二叉树的最小深度

    题目描述(难度简单) 给定一个二叉树,找出其最小深度.最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,n ...

  2. 数据结构-二叉链表存储的二叉树(利用先序遍历)

    树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用.对于每一个结点至多只有两课子树的一类树,称其为二叉树.二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前序.中序遍历 ...

  3. 【数据结构】基于二叉链表的二叉树结点个数的统计

    基于二叉链表的二叉树结点个数的统计 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别对二叉树的结点(度为0.1.2)个数进行统计. 输入 多组数据.每组数 ...

  4. 数据结构-二叉链表的结构与实现

    目录 一.引言 二.什么是二叉链表 三.二叉链表的结构 四.二叉链表的实现 1. 创建二叉链表 2. 遍历二叉链表 3. 插入节点 4. 删除节点 五.应用场景 六.总结 七.代码示例 一.引言 数据 ...

  5. 3010基于二叉链表的二叉树高度的计算

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为'0'时,表示该结点为空).当输 ...

  6. 3003基于二叉链表的二叉树左右子树的交换

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法交换该二叉树的左右孩子. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为空) ...

  7. 基于二叉链表的二叉树高度的计算

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为'0'时,表示该结点为空).当输 ...

  8. 3006基于二叉链表的二叉树最长路径的求解(附思路)

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为 ...

  9. 3010基于二叉链表的二叉树高度的计算(附思路,WA的一种可能情况及代码)

    基于二叉链表的二叉树高度的计算 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法计算二叉树的高度. 输入 多组数据.每组数据一行,为二叉树的前序序列(序列中元素为 ...

  10. 二叉链表-创建、遍历(前序、中序、后序、非递归、层次)、复制、计算深度、结点数、销毁(C语言)

    目录 二叉树的定义 二叉树的性质 二叉链表的基本操作 二叉链表的结构定义 前序遍历创建 前序.中序.后序遍历 中序遍历的非递归算法(栈) 层次遍历(队列) 复制二叉树 计算深度 计算总结点数与叶子结点 ...

最新文章

  1. 云原生解决什么问题?
  2. 骗子防不胜防,我们该如何安全上网?
  3. ai如何做倒角和圆角_石材路沿石是如何倒角的?倒角费用是多少?路沿石质量标准?...
  4. 3D集合图元:最小边界框/包围盒(boundingbox)
  5. java enum 报错_enum报错问题,求大神帮看下
  6. 【BZOJ2154】Crash的数字表格,数论练习之二维LCM(莫比乌斯反演)
  7. javascript 页面刷新
  8. can test 接收报文_CAN总线
  9. 结构体变量偏移量及大小计算
  10. 四阶龙格库塔法程序c语言,四阶龙格库塔法
  11. 关于计算机动画制作的过程,关于计算机制作动画的过程
  12. 初学者都能看懂的蒙特卡洛方法以及python实现
  13. C实现utf8与gbk互转
  14. Windows设备场景函数 - GetDC Ex
  15. 高射炮打蚊子丨用Visual Studio 2017写最初级的C语言程序
  16. Maven详解【Idea搭建Maven项目、Maven常用指令、Maven的传递性和依赖性、排除依赖】
  17. 深度学习要多深,才能读懂人话?|阿里小蜜前沿探索
  18. dependencyManagement和dependencies区别
  19. 课表插件timetable
  20. 前端面试题:如何画一条0.5px的线

热门文章

  1. 交易者的量化程序化交易之路
  2. 2022电大国家开放大学网上形考任务-劳动与社会保障法非免费(非答案)
  3. PHP表单省市县三级联动,用php做省份的三级联动 附带数据库
  4. 在AD中安装元件和封装库
  5. Python渗透测试之身份认证攻击
  6. 深入浅出数据分析读书笔记(head first into data analysis)
  7. 在FTP服务器上搜索指定文件
  8. Analysis::checkBidir2Nx2N()
  9. Qt - 自定义窗口 点击窗口外自动关闭
  10. Maven SCM Release版本控制与发布