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语言)相关推荐

  1. 数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序、中序、后序、层次)和线索二叉树

    二叉树每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,其次序不能任意颠倒. 1. 二叉树 二叉树一般采用链式存储结构,用链表节点来存储二叉树中每个节点.在二叉树 ...

  2. 顺序二叉树(堆)与链式二叉树的C语言实现

    文章目录 树的概念及结构 树的概念 树的相关概念 树的表示 树在实际中的运用 二叉树的概念及结构 二叉树的概念 现实中的二叉树 特殊的二叉树 二叉树的性质 二叉树的存储结构 二叉树的顺序结构及实现 二 ...

  3. 二叉树的存储方式【顺序储存(数组)、链式存储、邻接表存储等】

    其他二叉树知识!二叉树知识汇总 目录 前言: 1.顺序存储结构 2.链式存储结构 3.二维数组直接存储 4.邻接表存储 前言: 顺序存储和链式存储是经典讲解的内容,本文做简单理论介绍,而对于后两种:二 ...

  4. 二叉树(二)----->链式二叉树(上)

    文章的主体内容 1.链式二叉树链式二叉树的表示法 2.二叉树的前中后序遍历思想 3.求二叉树节点的个数及叶子节点的个数及第k层节点数 5.查找二叉树值为x的节点 6.二叉树的层序遍历 7.二叉树的深度 ...

  5. 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)

    本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...

  6. java链式结构_java语言实现队列顺序结构与链式结构

    本文主要向大家介绍了java语言实现队列顺序结构与链式结构,通过具体的内容向大家展示,希望对大家学习java语言有所帮助. 队列的顺序存储结构实现 public class Queue{ privat ...

  7. 图论部分模板(基于链式前向星的存储方式)

    图论篇部分模板(基于链式前向星的存储方式) 你还在为暴力枚举复杂度太高而苦恼吗?你还在为DP而痛苦吗?你还在为搜索剪枝而绞尽脑汁吗?选择链式前向星吧,链式前向星--专注存图20年 . 1. 链式前向星 ...

  8. GO语言-区块链离线钱包开发之如何存储私钥

    # 如何存储私钥 在确保私钥安全的情况下,为了更好的体验,我们需要让钱包把私钥存储起来.给用户更好的体验感.Geth是将私钥通过加密技术转换为json格式的文件,这个文件虽然是明文的,但是解析它的时候 ...

  9. c语言二叉树的头文件叫什么,西安交大朱站立数据结构——使用C语言》头文件系列——二叉树.doc...

    西安交大朱站立数据结构--使用C语言>头文件系列--二叉树 本文为二叉链存储结构的二叉树操作实现,实现了二叉树的定义.插入数据.删除数据.撤销以及二叉树的打印.前序遍历.中序遍历.后序遍历等.本 ...

  10. 树、二叉树、满二叉树、完全二叉树、二叉树的重要性质及其存储结构

    树的概念及结构 树的概念  树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成的一个具有层次关系的集合.把它叫做"树",是因为它看起来像一颗倒挂的树,也就是说它是根 ...

最新文章

  1. 算法炒房三月亏20多亿!房地产巨头大翻车!
  2. 千万别让这些举动断送了你的职业前程-好文共分享
  3. mysql ibdata作用_mysql data文件夹下ibdata1 文件作用
  4. Java实现有向图的拓扑排序
  5. 图像抠图Image Matting算法调研
  6. 国内网站安全测试6大步骤
  7. 自动化yaml文件_从YAML到TypeScript:开发人员对云自动化的看法
  8. linux下的单机工具,Linux下单机模式的Hadoop部署
  9. devops流程工具_您的DevOps工作流程依赖哪些工具?
  10. Combres库 学习小结以及部分源码分析
  11. BIEE11G系统数据源账号过期问题(默认安装步骤)
  12. myeclipse注册机,自己生成注册码
  13. Iframe的基础应用——关于Iframe刷页问题的两种方法
  14. 经度,纬度的正则表达式
  15. GSP算法与SPADE算法
  16. coco数据集分割可视化格式转换
  17. 毕业设计 基于云平台的火灾报警系统设计与实现 - stm32 物联网 单片机 OneNET云平台
  18. Youth means limitless possibilities.
  19. STM32F0 ADC学习
  20. 电脑不稳定? 可能系统已被病毒渗透:怎样判断是否遭受入侵

热门文章

  1. 用户画像技术及方法论
  2. 再见了,公司的“烂系统”
  3. 从 Servlet 入手带你看架构和框架设计的套路
  4. 阿里为啥值4万亿?看它如何应对亿级高并发大流量?如何保障高可用和稳定性,就知道了!...
  5. 八零后高薪程序员感慨中年危机,月薪五万多,想要跳槽没地方!
  6. 敏捷开发中如何做好Sprint规划?
  7. Leangoo敏捷开发工具怎么添加成员
  8. All-in-One 模式安装 KubeSphere 异常问题记录
  9. android服务重启间隔,android – 崩溃的服务在很长一段时间后重新启动
  10. html5div上下滚动,html5 – 在另一个div上滚动div