二叉树的定义和基本术语

二叉树是n个数据元素的有限集,它或为空集(n=0),或者含有唯一的称为根的元素,且其余元素分别分成两个互不相交的子集,每个子集自身也是一颗二叉树,分别称为根的左子树右子树。集合为空的二叉树简称为空树,二叉树中的元素也成为结点

二叉树的左子树和右子树是两棵互不相交的二叉树,因此二叉树上除根之外的任何结点,不可能同时在两棵子树中出现。二叉树上每个结点至多只有两颗子树,并且有左右之分,其次序不能任意颠倒。

下面接收一些名词,如上图,2是1的左孩子,3是1的右孩子;1是2和3的父亲;根节点没有父亲,两个结点的父亲为同一结点则这两个结点为兄弟,2和3是兄弟,5和6不是兄弟但可以称之为堂兄弟,因为他们各自的父亲是兄弟;1为根的二叉树中所有的结点均为1的子孙。

左右子树均为空的结点称为叶子结点,所有非叶子结点称之为分支结点。结点的子树个数称之为结点的度;叶子结点的度为0,二叉树中结点的度数最大为2。结点在二叉树中的层次约定为:跟结点的层次为1,根节点的孩子层次为2,以此类推;二叉树中叶子结点的最大层次数定义为二叉树的深度。

特殊形态的二叉树分为:满二叉树和完全二叉树。如下图所示:

二叉树的基本操作包括:建立和销毁一棵二叉树,判断二叉树是否为空,返回二叉树的深度,由某个结点返回其双亲或者孩子等等;大致分为 插入类,查找类和删除类。

二叉树的基本性质

1,二叉树的第 i 层上至多有  个结点。

2,深度为 k 的二叉树至多有  个结点(k>=1)。

3,对任何一棵树,如果其终端结点数位 ,度为2的结点数为  ,则 

4,具有 n 个结点的完全二叉树的深度为 

二叉树的存储结构

1,顺序存储结构

对于完全二叉树,只要从根起按层序存储即可。将完全二叉树上编号为 i 的结点元素存储在一维数组中下标为 i - 1 的分量中。对于一般二叉树,可以对应于完全二叉树进行存储,不存在的结点用零来代替。但是这样会造成极大的浪费,因此不合适。所以这种存储方法只适合完全二叉树(自然包括满二叉树)。其顺序存储结构定义如下:

const int MAXSIZE = 100;  //暂定二叉树中结点数最大100
typedef struct {int *data;    //存储空间基址int nodenum;   //树中结点数
}SqBiTree;

2,链式存储表示

由于二叉树是一种非线性结构,因此采用链式存储结构比较合适,设计不同的结点结构可以构成不同形式的链表。表示二叉树的结点至少要包含三个域:数据域和分别指向左,右子树的指针域构成。有时为了方便找到结点的双亲,还可以增添一个指向其双亲结点的指针。利用这两种结点结构可以构成二叉树的二叉链表和三叉链表。链表的头指针指向二叉树的根结点。在不同的存储结构中,实现基本操作的方法不同。所以在应用程序中采用何种存储结构应该由二叉树的形态和进行的操作类型共同决定。如下为二叉树的二叉链表存储表示:

typedef struct BiTNode {int data;struct BiTNode *lchild, *rchild;    //左右孩子指针
}BiTNode,*BiTree;

本笔记所依据的教材为严薇敏版的《数据结构及应用算法教程》

部分图片来源于华中师范大学云课堂

所有代码在Visual Studio 2017上均可正常运行

如有错误欢迎指出

二叉树的定义 性质 及存储结构相关推荐

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

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

  2. 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...

    已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法 #define N 10 //二叉树节点的个数 char postorderstr[]={};//后序序列 char i ...

  3. 假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法。

    假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法. #include<iostream>//蓝多多算法实验五:二叉树的应用(二) #inclu ...

  4. 6.2 二叉树的定义、性质与存储结构

    0. 引子 1. 二叉树的定义 2. 二叉树的性质 3. 二叉树的存储结构 (1) 树的表示法 通常,像树.图.栈.队列等数据结构下数据的存储表示,都是基于线性表.线性表有两种结构:[顺序存储结构和链 ...

  5. 设计算法统计二叉树(采用二叉链存储结构)中结点值为x的结点个数_20题,算法工程师能力评估测试来啦...

    试题部分 1. class program { static void Main(string[] args) { int i; i = x(x(8)); } static int x(int n) ...

  6. 二叉树的二叉链表存储结构构建以及先序遍历

    #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 typedef int TElemTy ...

  7. 西工大NOJ数据结构理论——015.建立二叉树的二叉链表存储结构(严6.70)

    我相信,大家都已经了解了这道题的背景,以及明白了我们需要做的事情. 对于这道题的背景,相信大家都熟悉,所以就不说了. 关于我们需要做的事情,大家也已经有了自己的思路.所以,我只在下面简短的写一写我的思 ...

  8. 再谈二叉树(二叉树概念,二叉树的性质,二叉树的存储结构)

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

  9. 【数据结构】 实验报告10 顺序、链式存储结构的二叉树递归遍历、层次遍历求高度

    一.实验目的和要求 (源码在最后) 要求: 两种及以上存储结构(建议 顺序存储结构和链式存储结构各一).两种及以上方法(建议 递归遍历和层次遍历方法各一).分析各代码性能. 抽象数据类型(二叉树)独立 ...

最新文章

  1. 设计一个扩展自抽象类geometricobject的新的triangle类_C++ 接口(抽象类)
  2. rtsp中的rtp发送和head理解
  3. LAMP+Postfix+Dovecot+Postfixadmin搭建邮件管理系统(六)
  4. python爬虫原理-干货|如何入门 Python 爬虫?爬虫原理及过程详解
  5. 分布式存储(姚文辉)
  6. MATLAB基本操作(一):MATLAB中变量的文件存储
  7. hdu 5592 ZYB's Premutation (线段树+二分查找)
  8. 大厂十年:我的三段职业经历和八条建议!
  9. 华为云容器部署WordPress服务
  10. linux 网络io 监控,Linux教程:Linux性能监控-NetworkIO
  11. 高级计算机网络 ppt模板,高级计算机网络幻灯片课件.ppt
  12. hdu acm2548
  13. c4d导出html,C4D动力学如何导出fbx或者其他格式?
  14. 关于flash player的问题
  15. Windows - 修复所有快捷方式的打开方式
  16. 《凤凰项目-一个IT运维从传奇故事》读后感+个人职业思考
  17. Matlab中绘制折线图(附matlab代码)
  18. ssis sql oracle,[SQL][SSIS]透過 SSIS 連接 Oracle 的資料庫
  19. 和平精英灵敏度分享码服务器没有响应,和平精英灵敏度分享码怎么弄 灵敏度分享码怎么用...
  20. [JZOJ4940]前鬼后鬼的守护/[JZOJ4623]搬运干草捆

热门文章

  1. Android之——Surface、SurfaceView与SurfaceHolder.Callback初探
  2. 2021011029wxy-实验8数据更新
  3. 用机器学习打造聊天机器人(四) 代码篇
  4. 多功能超声波换能器驱动电路PCB线路板设计
  5. 关于updatepanel
  6. Sensor ISP 图像信号处理系统
  7. 将集合元素进行拼接的方法
  8. NYOJ409 郁闷的c小加三
  9. SAP低值易耗品做固定资产处理的折旧测试
  10. java中怎么调用非静态方法有哪些_java中 静态方法和非静态方法的调用