数据结构与算法(三)---二叉树的性质及基本遍历


最开始的时候,学习数据结构我们需要,数据结构与算法的关系 货物存储–数据结构 运输路线–算法, 它是分为逻辑结构(面向用户)和存储结构(面向计算机),逻辑结构我们知道有线性和非线性结构,在前面的章节中,我们介绍了线性表,接下来将重点介绍逻辑结构中的非线性结构之一—树。本章主要涉及到基本概念性质,操作。具体框架如下

1. 概念特点
1.1 树的概念和结构特点:

构造性定义:
直观定义

1.2. 树的逻辑结构特点:

  • 除根结点之外,每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继
  • 一对多,层次关系

1.3 树的基本术语

此外,还有有序树、无序树:如果一棵树中结点的各子树从左到右是有次序的,称这棵树为有序树;反之,称为无序树。
森林:m (m≥0)棵互不相交的树的集合。
注意::: 老师说树不为空,但森林可以为空----有争议 百度百科又说空集合也是树,称为空树。空树中没有结点
另外二叉树可以为空 但树不能为空 为什么??
-----有争议,树它是由n(n>=1)个有限结点组成一个具有层次关系的集合,二叉树是n>=0节点组成的集合。二叉树和树并不是集合包含关系
不同版本的书籍定义的不同,不必在意

1.4 树结构和线性结构的比较

2. 特殊的二叉树
首先介绍二叉树的定义,然后再介绍几种特殊的二叉树,
** 2.1 二叉树定义特点**

**注意:**需要区分树和二叉树的不同构成形态:树不在乎左右子树,在那边都是一样的,二叉树严格控制左右子树的顺序

2.2 特殊的二叉树
2.2.1 斜树:(退化到线性结构)斜树
结点个数等于高度, 每一层只有一个结点
针对于算法复杂性, 单链表复杂度查找0(n),二叉树最差是一对一的时候,即斜树也是0(n),分叉越多,高数越低,效率就好,算法复杂性就会降低。

2.2.2 满二叉树: 叶子结点最后一层,每个分支结点度都为2, 结点数最多,

2.2.3 完全二叉树: 完全二叉树可看做是满二叉树从右到左删除的结果,k-1层满二叉树,k层左结点

2.3 二叉树性质
(1) 二叉树的第 i 层最多有 2i-1 个结点。(i>= 1)

(2)高度为 k (k >=1)的二叉树最多有 2k - 1个结点,最少有k个结点

(3) 在非空二叉树中,如果叶子结点数为n0,度为2的结点数为n2,则有: n0=n2+1,而与度数为1的结点数n1无关。

满二叉树,只有叶子节点和度为2的节点,即n=n0+n2, 有因为n0=n2+1,代入n2+n2+1=n n0=n+1/2

(4) 完全(满)二叉树的性质

拓展:二叉树的顺序存储结构–层次遍历,一层一层过

2.4 二叉树的遍历操作
遍历的结果是二叉树节点的线性化,非线性结构线性化 有四种遍历手段,层次,前序,后序,中序四种。


这个图片错误,后序是先左后右再是根


已知前序和中序可唯一确定二叉树 --√

假设已知前序是ABDGCEF ,中序是DGBAECF, 1)前序是先根开始的,所以A是根,而中序是左-根-右,则A左边的是左子树DGB,右边是右子树集ECF,2)先看左边,又因为A的下一位是B,所以B是左节点,而之前得到DGB都是左边的,所以B是DG 的根节点,又因为B的下一位是D,左边,所以B的左节点是D,右节点是G,3) 看右边,是CEF排序,所以C是根,EF是左右节点据此可唯一确定一个二叉树。

已知后序和中序可唯一确定二叉树 --√

假设已知后序是GDBEFCA , 中序是DGBAECF, 1)先找出根节点,由于后序是左-右-根,所以最后一个节点即A是根节点,由此根据中序得到A的左子树集是DGB,右子树集是ECF, 2)先看左边,后序是GDB顺序排列,即左-右-根,得到B的左节点是D,右节点是G,)看右边,EFC 排列,所以C是根,EF是左右节点据此可唯一确定一个二叉树

已知层序和中序可唯一确定二叉树–√

假设已知层序是ABCDEFG , 中序是DGBAECF, 1)确定第一层,找根节点, 层序是从第一层根开始的,所以A是根,第一层 此根据中序得到A的左子树集是DGB,右子树集是ECF。 2)看第二层, 因为一个节点度最大为2,所以第二层可能只有B,或者有BC, 但是中序根两边都有,确定 BC在第二层,3)看第三层,因为层次排序是从左往右,从上往下,所以DEFG应该是依次列开。据此可唯一确定一个二叉树

已知前序和后序可唯一确定二叉树–×

假设已知后序是GDBEFCA ,前序是ABDGCEF 1) 根据前后序规则,可确定根节点,但是无法进行下一步确定其他节点了。
一般情况下,已知二叉树的前序和后序是无法唯一确定一颗二叉树的,因为可能存在多种情况,即一个结点可能是根的左孩子也有可能是根的右孩子。前序的开始的第一个与后序的最后一个是相等的,这个结点就是根结点,以后序的根结点的前面一个结点作为参考,寻找这个结点在前序中的位置,如果这个位置的前一个位置的节点不是上一次遍历的前序序列中第一个起始节点,则部分唯一。递归进行下去,如果直到递归结束,上述条件持续成立,则该树唯一确定。反之不唯一。


2.5 二叉树基本操作

问题: 一棵含有n个节点二叉树的结点数据采用顺序存储结构,在最坏的情况下浪费??个空间.
最坏的情况就是这个二叉树是单支数。 比如有 k 层,它的节点数字也是 k 。
那么它需要 2^K - 1 长度的数组来存放,而实际上它只有 k 个节点。
有n个叶子节点,只有度0和2,即满二叉树,用顺序存储,即把所有的节点都存上,最后一层第i层的节点数全部是叶子节点即2^i-1=n,可求得i,总共节点总数是2 ^i -1,
带入既得则需要空间为2n-1

2.5.1 遍历算法操作-----这是递归形式
算法–名字 参数 返回值是什么状态
不同之处在于访问时机不同

2.5.2 二叉树的存储结构
要想实现二叉树的算法,必须要把数据存储在计算机中,顺序或者链接 存储。
顺序存储结构 参考上面“拓展部分”

缺点: 一般二叉树的顺序存储结构一棵斜树的顺序存储会怎样呢?
高度为k的右斜树,k个结点需分配2k-1个存储单元.需增加很多空结点,造成存储空间的浪费.对于普通二叉树不合适。

链接存储

其中在这里,我们首先要定义存储结构,而关于如何构建二叉树有三种方法,递归的,非递归的,引用的,如下所示。(一定要先指向根,c 语言中参数传递有几种机制,1,传值,自己内部消化,局域变量 2,传地址, 全局变量 --引用,形参和实参共用一个地址, 改成用指针来实现把用引用实现的函数改成用指针),因此在非递归中我们使用到了指针。
在这里插入图片描述
链接存储遍历
主要有两大类,一类是递归的,即计算机进行的出栈入栈操作,一类是非递归的,即人为设置出栈入栈,
先递归的

人工实现出栈入栈 黑—先序–蓝—中序,红色—后序





层次遍历 看队列是否有空
在这里插入图片描述
二叉树遍历算法的应用实例
遍历可以将树这种非线性结构转变为线性结构


数组,链表, 循环链表牢记
其他链表存储结构
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值