算法与数据结构之二叉树

前言

树是使用了递归定义的数据结构,树的子树还是树,其结构如下图所示:
在这里插入图片描述

  • 度:结点拥有的子树数目,例如上图结点A的度为3,结点E的度为0
  • 叶子或终端结点:度为0的结点(没有子树的结点)
  • 树的度:各个结点中度的最大值
  • 孩子:结点的子树的根,称为根的孩子
  • 层次:根的层次为0,根的孩子为1,以此类推
  • 深度:树中结点的最大层次,称为树的深度

定义

二叉树是一种每个结点至多只有两个子树(即二叉树的每个结点的度不大于2),并且二叉树的子树有左右之分,其次序不能任意颠倒。

性质

  • 在二叉树的第i层,至多有2^(i-1)个结点
  • 深度为k的二叉树至多有:(2^k)-1个结点,其实这个结果就是一个等比数列的求和得到的。
  • 对任意一颗二叉树,如果其叶子结点数量为:n0,度为2的结点数为:n2,则:n0=n2+1
  • 具有n个结点的完全二叉树的深度为:[log2n]+1,其中[log2n]+1是向下取整。

说明:这里对第三个性质做一个解释,首先我们都知道一个二叉树每个结点都是由度为0,1,2,三种情况,我们这里假设,二叉树有n个结点,其中度为1的结点数为:n1,于是由已知条件可知:n=n1+n0+n2;
好,现在,我们在从另外一个角度想,我们二叉树有B条边,假设这些边都是从父亲结点指向它的孩子,那么我们会发现除了根结点外,其他结点都是有一条边的,所以:n=B+1,其中这些边都是由度为1和2的结点射出来的,所以:B=n1+2n2,因此:n=n1+2n2+1.所以,联立等式:n1+2*n2+1=n1+n0+n2,我们可以得到一个等式:n0=n2+1;
第四个性质:首先我们先定义满二叉树:一颗深度为k且结点数为:(2k)-1的二叉树,我们称为满二叉树,然后,我们对满二叉树进行编号,从根结点开始,从左往右,从上到下。然后就是可以定义一个完全二叉树:深度为k,结点数为n的二叉树,而且,每一个结点的位置都和深度为k的完全二叉树中编号为1到n的结点一一对应,我们称为完全二叉树。
在这里插入图片描述
然后,我们现在就可以解释第四个性质了,假设我们的深度为k,由我们的完全二叉树的定义,我们可以知
道:2(k-1)-1< n <=(2k)-1 即:2(k-1)<=n<(2k),所以:k-1 < = [log2n] < k,因为k是整数,所以k=[log2n]+1,其中[log2n]+1是向下取整。

  • 有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
     若i为结点编号则 如果i>1,则其父结点的编号为[i/2],[i/2]是往下取整的;
     如果2i<=N,则其左儿子(即左子树的根结点)的编号为2i;若2i>N,则无左儿子;
     如果2i+1<=N,则其右儿子的结点编号为2i+1;若2i+1>N,则无右儿子。
     如果不明白,你可以画个完全二叉树

二叉树的存储结构

(1)顺序存储结构:
顺序存储结构其实就是在一个连续存储单元里,从根结点开始,像对完全二叉树编号的顺序一样,把我们的二叉树的内容存储在一个一维数组中,一般顺序存储结构是拿来存储完全二叉树的,但是也可以拿来存储一般的二叉树,只是要按照完全二叉树的规则来编号,如果没有的就存0,如下图所示:
在这里插入图片描述
2)链式存储结构(比较常用一种存储结构)

由二叉树的定义可知道,我们链式存储结构至少包含三个部分:数据域和两个指针域,一个指向左孩子,另一个指向右孩子,我们称这种链表为二叉链表,另外一种就是我们还可以添加一个指针域,指向其父亲结点,我们称为三叉链表,如下图所示:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值