c语言二叉树链式存储,二叉树链式存储基本操作(C语言)
1、二叉链的定义
LinkBinTree.h文件
/** 二叉树结点结构 */
typedef struct _binnode
{
int data;
struct _binnode * lchild;
struct _binnode * rchild;
}BinNode;
/** 二叉树结构 *///可以定义,也可以不定义,主要使用其中的根结点
typedef struct _bintree
{
BinNode * root; //二叉树根结点
int length; //结点总数
int depth; //树的深度
}BinTree;
2、基本操作函数声明
LinkBinTree.h文件
/** 初始化二叉链 */
void InitLinkBinTree(BinTree * tree);
/** 创建二叉链*/
int CreatLinkBinTree(BinNode ** root);
/** 先序遍历 */
void PreOrderTraverse(BinNode * root);
/** 中序遍历 */
void InOrderTraverse(BinNode * root);
/** 后序遍历 */
void PostOrderTraverse(BinNode * root);
/** 层序遍历 */
void ZOrderTraverse(BinNode * root);
/** 二叉树的深度 */
int BinTreeDepth(BinNode * root);
/** 二叉树结点数量 */
int BinTreeNodeNumber(BinNode * root);
/** 二叉树叶结点数量 */
int BinTreeLeafNodeNumber(BinNode * root);
3、实现操作函数
LinkBinTree.c文件
1、初始化二叉树
void InitLinkBinTree(BinTree * tree)
{
tree->root = NULL;
tree->depth = 0;
tree->length = 0;
}
2、创建二叉树
创建二叉树大概分为4步:
<1>、接收用户输入数据
<2>、判断用户输入数据,是否结束当前子树的创建
<3>、如果输入0就返回上一层,反之为该结点分配空间,并存储输入数据
<4>、然后递归调用,构建结点的左右子树,重复上述操作
在创建二叉链时,需要在子函数里面为结点分配空间,那么函数传参时,就需要传入结点指针的地址
!!重点 !!
因为在主函数定义一个树结点时,就只是一个结点指针(BinNode * tree),结点指针并没有在堆中被分配空间,所以在创建二叉链函数中就需要为结点分配空间,但是在子函数如果要操作一个变量,那么就需要传入这个变量的地址,所以函数参数需要传入结点指针的指针,也就是结点指针的地址
int CreatLinkBinTree(BinNode ** root)
{
int input;
scanf("%d",&input);
if(input == 0)
{
*root = NULL;
return 0;
}
else
{
*root = (BinNode *)malloc(sizeof(BinNode));
if(!root)
printf("Creat Fail!\n");
(*root)->data = input;
CreatLinkBinTree(&((*root)->lchild)); //构建左子树
CreatLinkBinTree(&((*root)->rchild)); //构建右子树
}
}
3、遍历
详细的遍历方式
4、二叉树的深度
分别递归根结点的左右孩子结点,比较左右子树深度,最后深度大的+1(根结点)就为树的深度
int BinTreeDepth(BinNode * root)
{
if(root == NULL)
return 0;
int maxLeft = BinTreeDepth(root->lchild);
int maxRight = BinTreeDepth(root->rchild);
if(maxLeft > maxRight)
return maxLeft + 1;
else
return maxRight + 1;
}
5、二叉树总结点数量
还是递归左右孩子结点,左右子树结点之和+1(根结点),就为树总结点数量
int BinTreeNodeNumber(BinNode * root)
{
if(root == NULL)
return 0;
return BinTreeNodeNumber(root->lchild) + BinTreeNodeNumber(root->rchild) + 1;
}
6、二叉树叶结点数量
递归左右孩子结点,遇到度为0的返回1,最后将左右子树度为0的数量相加,就为叶结点数量
int BinTreeLeafNodeNumber(BinNode * root)
{
if(root == NULL)
return 0;
if(root->lchild == NULL && root->rchild == NULL)
return 1;
else
return BinTreeLeafNodeNumber(root->lchild) + BinTreeLeafNodeNumber(root->rchild);
}
总之,无论是创建、遍历还是结点数量的统计,都与递归密不可分,代码简单,但理解还是需要多下功夫!!
c语言二叉树链式存储,二叉树链式存储基本操作(C语言)相关推荐
- 数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序、中序、后序、层次)和线索二叉树
二叉树每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,其次序不能任意颠倒. 1. 二叉树 二叉树一般采用链式存储结构,用链表节点来存储二叉树中每个节点.在二叉树 ...
- 顺序二叉树(堆)与链式二叉树的C语言实现
文章目录 树的概念及结构 树的概念 树的相关概念 树的表示 树在实际中的运用 二叉树的概念及结构 二叉树的概念 现实中的二叉树 特殊的二叉树 二叉树的性质 二叉树的存储结构 二叉树的顺序结构及实现 二 ...
- 二叉树的存储方式【顺序储存(数组)、链式存储、邻接表存储等】
其他二叉树知识!二叉树知识汇总 目录 前言: 1.顺序存储结构 2.链式存储结构 3.二维数组直接存储 4.邻接表存储 前言: 顺序存储和链式存储是经典讲解的内容,本文做简单理论介绍,而对于后两种:二 ...
- 二叉树(二)----->链式二叉树(上)
文章的主体内容 1.链式二叉树链式二叉树的表示法 2.二叉树的前中后序遍历思想 3.求二叉树节点的个数及叶子节点的个数及第k层节点数 5.查找二叉树值为x的节点 6.二叉树的层序遍历 7.二叉树的深度 ...
- 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)
本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...
- java链式结构_java语言实现队列顺序结构与链式结构
本文主要向大家介绍了java语言实现队列顺序结构与链式结构,通过具体的内容向大家展示,希望对大家学习java语言有所帮助. 队列的顺序存储结构实现 public class Queue{ privat ...
- 图论部分模板(基于链式前向星的存储方式)
图论篇部分模板(基于链式前向星的存储方式) 你还在为暴力枚举复杂度太高而苦恼吗?你还在为DP而痛苦吗?你还在为搜索剪枝而绞尽脑汁吗?选择链式前向星吧,链式前向星--专注存图20年 . 1. 链式前向星 ...
- GO语言-区块链离线钱包开发之如何存储私钥
# 如何存储私钥 在确保私钥安全的情况下,为了更好的体验,我们需要让钱包把私钥存储起来.给用户更好的体验感.Geth是将私钥通过加密技术转换为json格式的文件,这个文件虽然是明文的,但是解析它的时候 ...
- c语言二叉树的头文件叫什么,西安交大朱站立数据结构——使用C语言》头文件系列——二叉树.doc...
西安交大朱站立数据结构--使用C语言>头文件系列--二叉树 本文为二叉链存储结构的二叉树操作实现,实现了二叉树的定义.插入数据.删除数据.撤销以及二叉树的打印.前序遍历.中序遍历.后序遍历等.本 ...
- 树、二叉树、满二叉树、完全二叉树、二叉树的重要性质及其存储结构
树的概念及结构 树的概念 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成的一个具有层次关系的集合.把它叫做"树",是因为它看起来像一颗倒挂的树,也就是说它是根 ...
最新文章
- 算法炒房三月亏20多亿!房地产巨头大翻车!
- 千万别让这些举动断送了你的职业前程-好文共分享
- mysql ibdata作用_mysql data文件夹下ibdata1 文件作用
- Java实现有向图的拓扑排序
- 图像抠图Image Matting算法调研
- 国内网站安全测试6大步骤
- 自动化yaml文件_从YAML到TypeScript:开发人员对云自动化的看法
- linux下的单机工具,Linux下单机模式的Hadoop部署
- devops流程工具_您的DevOps工作流程依赖哪些工具?
- Combres库 学习小结以及部分源码分析
- BIEE11G系统数据源账号过期问题(默认安装步骤)
- myeclipse注册机,自己生成注册码
- Iframe的基础应用——关于Iframe刷页问题的两种方法
- 经度,纬度的正则表达式
- GSP算法与SPADE算法
- coco数据集分割可视化格式转换
- 毕业设计 基于云平台的火灾报警系统设计与实现 - stm32 物联网 单片机 OneNET云平台
- Youth means limitless possibilities.
- STM32F0 ADC学习
- 电脑不稳定? 可能系统已被病毒渗透:怎样判断是否遭受入侵
热门文章
- 用户画像技术及方法论
- 再见了,公司的“烂系统”
- 从 Servlet 入手带你看架构和框架设计的套路
- 阿里为啥值4万亿?看它如何应对亿级高并发大流量?如何保障高可用和稳定性,就知道了!...
- 八零后高薪程序员感慨中年危机,月薪五万多,想要跳槽没地方!
- 敏捷开发中如何做好Sprint规划?
- Leangoo敏捷开发工具怎么添加成员
- All-in-One 模式安装 KubeSphere 异常问题记录
- android服务重启间隔,android – 崩溃的服务在很长一段时间后重新启动
- html5div上下滚动,html5 – 在另一个div上滚动div