1、基本术语:

度:有两种度“结点的度”与“树的度”。结点的度指的是一个结点子树的个数;树的度是指树中结点度的最大值。

叶子结点:指的是没有子树的结点

层:树是有层次的,一般根结点为第0层。规定根结点到某结点的路径长度为该结点的层数。

深度:树中结点的最大层数

兄弟:同一双亲的结点,互为兄弟

堂兄弟:双亲在同一层次的结点,互为堂兄弟

祖先:从根结点到该结点的路径上的所有结点都是该结点的祖先。

子孙:以某一结点为根的子树上的所有结点都是该结点的子孙

森林:n棵互不相交的树

2、二叉树:

不同于树,结点的度<=2,而且子树有左右之分,如下图:

编号规则为从左到右、从上到下,如下图:

性质1:位于第i层的结点个数不大于2的i次方。

性质2:二叉树的深度为n,二叉树总的结点个数不大于2的n+1次方减去1。

性质3:叶子节点个数 = 度为2的结点个数 + 1

满二叉树:除了最底层的结点外,其余结点的度均为2,如下图

完全二叉树:
官方定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树

(1)所有的叶结点都出现在第k层或k-l层(层次最大的两层)
(2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+l。

一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边的若干结点缺失的二叉树,则此二叉树成为完全二叉树。

性质1:编号为i的结点的双亲编号为i/2,结果取整

性质2:编号为i的结点的左孩子编号为2i,右孩子编号为2i+1


性质3:完全二叉树的结点总数为n,则该完全二叉树的高为log以2为底求n的对数,结果取整


二叉树的实现:

顺序存储:

对于完全二叉树和满二叉树可以利用完全二叉树的性质2来定位双亲和孩子的位置。如下图:


对于一般的二叉树,采取补值的方法将二叉树补成完全二叉树,再利用完全二叉树的顺序存储方式。



链式存储:

结点包含3个值:数据域、指向左子树的指针、指向右子树的指针



二叉树的遍历:

先根遍历:DLR 首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

中根遍历:LDR 首先遍历左子树然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。

后根遍历:LRD 首先遍历左子树然后遍历右子树,最后访问根结点。在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。

树如何转换成二叉树?

步骤1:仅保留最左边孩子与根节点的连线,并连接兄弟结点。如下图,B是A最左边的孩子,所以保留A与B的连线,断开A与C,A与D的连线。B、C、D是兄弟,所以将BCD连接起来。对于以B、C、D为根的子树仍然按照这样的规则转换。

步骤2:左子树顺时针旋转45度,便得到了转换后的二叉树

二叉树如何转换成树?

步骤1:与树转换成二叉树的步骤相反,左子树逆时针旋转45度

步骤2:断开兄弟之间的连线,连接双亲。


森林如何转换成二叉树?

步骤1:每棵树都先转换为二叉树

步骤2:以第一棵树的根结点为根结点,将根结点依次连接起来

步骤3:按照根结点顺时针旋转45度

二叉树如何转换成森林?

步骤1:断开根结点与右子树的连线,对于右子树仍然按照规定断开与右子树的连线。这样得到多个二叉树

步骤2:将每棵二叉树转换为树

数据结构-二叉树、完全二叉树、森林等(基础讲解)相关推荐

  1. 数据结构--二叉树与森林记事本

    基本性质 5条基本性质 基操 #include <bits/stdc++.h> using namespace std; #define MAXSIZE 100 typedef struc ...

  2. 数据结构-树,二叉树,森林

    树,二叉树,森林 王卓老师的数据结构课程笔记 树和二叉树 定义 结点之间有分支,具有层次关系 是n个结点的有限集. 若n = 0,称为空树: 若n > 0,则它满足如下两个条件: 有且仅有一个特 ...

  3. 数据结构——树、森林和二叉树之间的转换

    摘自大佬博客http://www.cnblogs.com/zhuyf87/archive/2012/11/04/2753950.html 树转换为二叉树 (1)加线.在所有兄弟结点之间加一条连线. ( ...

  4. 数据结构-----二叉树,树,森林之间的转换

    图片和转换步骤来自这里 本文主要描述具体实现 用一种略微老土的话描述: 二叉树:每一节点最多有2个子节点,左边的叫左节点,右边的叫右节点,自己叫根节点. 树:每个节点的子节点数量不受限制. 森林:由若 ...

  5. [数据结构]树、森林与二叉树之间的相互转换方法

    树.二叉树与森林的相互转换 本文只给出树.森林与二叉树之间的转换方法,而详细的证明过程不在本文讨论范围之内. 树 → 二叉树 在所有兄弟结点之间加一连线. 对每个结点,除了保留与其长子的连线外,去掉该 ...

  6. 数据结构——简单实现森林转化为二叉树

    孩子兄弟表示法的理解与代码实现|树转化为二叉树 森林是由若干棵树组成,可以将森林中的每棵树的根结点看作是兄弟,由于每棵树都可以转换为二叉树,所以森林也可以转换为二叉树. 将森林转换为二叉树的步骤是: ...

  7. 数据结构——树、森林、二叉树的转换

    树.森林与二叉树的转换 树转换二叉树 规则:左孩子右兄弟,每个结点左指针指向它的第一个孩子结点,右指针指向它在树中相邻兄弟结点. 二叉树转换为树 规则: 逆过程,将指针修改回来,指向其双亲结点. 森林 ...

  8. 数据结构-二叉树-详解

    目录 一.树的概念及结构 1.1树的概念 1.2 树的相关概念​ 1.3树的表示 1.4树在实际中的运用(表示文件系统的目录树结构) 二. 二叉树的概念及结构 2.1概念 2.2特殊二叉树 2.3二叉 ...

  9. 数据结构:二叉树及堆排序

    文章目录 1.树概念及结构 1.1 树的概念 1.2树的表示 1.3树在史记中的运用 2. 二叉树概念及结构 2.1 概念 2.2 特殊的二叉树 2.3二叉树的存储结构 2.3.1 顺序存储 2.5. ...

最新文章

  1. Ackerman 函数-奇怪的函数
  2. 每日一皮:2020年度最佳微小说...
  3. Objective-C:浅复制(拷贝)
  4. HBase中的时间维度
  5. Androidstudio 使用git插件提交代码
  6. 用ionic快速开发hybird App(已附源码,在下面+总结见解)
  7. Content Provider之一大菊观
  8. mysql5.7.23手动配置安装windows版
  9. JVM——三个ClassLoader详解
  10. Redis进阶之主从复制
  11. Android设置toolbar高度,Android基础知识之 Toolbar 的使用
  12. 五人合伙最佳股份分配_【干货要点】再谈“类直营”——百果园的店长合伙人...
  13. HTTPBrowserCapabilities---在asp.net中显示浏览器属性
  14. ARM 指令集跳转指令
  15. 目标检测——数据清洗的学习笔记
  16. mycat mysql 主从_Mycat实现Mysql主从读写分离
  17. python的输出语句
  18. CPC客户端安装教程(2022/4/1)
  19. Civil2019程序安装及注意事项
  20. 开年第一炸:黑马程序员1月就业报告新鲜出炉!

热门文章

  1. 排序方法整理Java - 冒泡排序、选择排序、插入排序、快速排序
  2. java url 解码 编码 奇怪的解码两次
  3. TensorFlow——多维矩阵的转置(transpose)
  4. Nginx之负载均衡
  5. Matlab读取txt文件中的数据(使用textread函数)
  6. C++、C#写的WebService相互调用
  7. 格式说明_法律文书:公司单位民事起诉状格式范本及说明,最高人民法院2016...
  8. java 调用存储过程
  9. 欧盟出台首个网络与信息安全指导性法律
  10. mybatis 批量增加 Parameter '__frch_item_0' not found. Available parameters are [list]