【数据结构】树与二叉树知识点

树与二叉树

一、树的基本概念

1.树的定义
树是 n (n>=0) 个结点的有限集。当n=0时,称为空树。在任意一棵非空树中应满足:
(1)有且仅有一个特定的被称为根的结点。
(2)当 n >1 时,其余结点可分为 m (m>0) 个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。

2.树的结构特点
树的定义是递归的,在树的定义中又用到了其自身,树是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构。具有以下几个特点:
(1)树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
(2)树中所有结点可以有零个或多个后继。
(3)具有n个结点的树有n-1条边。

3.树的基本术语
(1):树中一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度。
(2)度大于0的结点称为分支结点(又称非终端结点),度为0(没有子女结点)的结点称为叶子结点(又称终端结点)。在分支结点中,每个结点的分支数就是该结点的度。
(3)树的深度、高度和层次
结点的深度:是从根结点开始自顶向下逐层累加的。
结点的高度:从叶子结点开始自底向上逐层累加的
树的高度(或深度):树中结点的最大层数。
(4)有序树和无须树:树中结点的各子树从左到右是由有次序的,不能互换,称该树为有序树,否则称为无序树。
(5)路径和路径长度:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,而路径长度是路径上所经过的边的个数。
注意:由于树中的分支是有向的,即从双亲指向孩子,所以树中的路径是从上向下的,同一双亲的两个孩子之间不存在路径
(6)深林:深林是m (m>0) 棵互不相交的树的集合。把树的根结点删去就变成了深林,反之,只要给m棵独立的树加上一个结点,并且把这m棵树作为该结点的子树,则深林就变成了树。

4.树的基本术语
树具有如下最基本的性质:
(1)树中的结点数等于所有结点的度数加1。
(2)度为m的树中第 i 层上至多有m^(i-1)个结点(i>=1)。
(3)高度为h的m叉树至多有(m^h-1)/(m-1)个结点。
(4)具有n个结点的m叉树的最小高度为[logm(n(m-1)+1)]

二、二叉树的概念

1.二叉树的定义及其主要特性

1.1.二叉树的定义
(1) 二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。
(2)二叉树也以递归的形式定义。二叉树是n(n>=0)个结点的有限集合:
a.或者为空二叉树,即 n=0。
b.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。
注意:二叉树是有序树,若将其左、右子树颠倒,则成为另一棵不同的二叉树。
(3)二叉树与度为2的有序树的区别:
a.度为2的树至少有3个结点,而二叉树可以为空。
b.度为2的有序树的孩子的左右次序是相对于另一孩子而言的,若某个结点只有一个孩子,则这个孩子就无须区分其左右次序,而二叉树无论其孩子数是否为2,均需确定其左右次序,即二叉树的结点次序不是相对于另一结点而言,而是确定的。

1.2.几个特殊的二叉树
(1)满二叉树:一棵高度为h,且含有2^h-1个结点的二叉树称为满二叉树,即树中的每层都含有最多的结点。满二叉树的叶子结点都集中在二叉树的最下一层,除叶子结点之外的每个结点度数均为2。可以对满二叉树按层序编号:约定编号从根结点(根结点编号为1)起,自上而下,自左向右。对于编号为 i 的结点,若有双亲,则其双亲为 i/2,若有左孩子,则左孩子为2i;若有右孩子,则右孩子为2i+1。
(2)完全二叉树:高度为h、有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树。
(3)二叉排序树:左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有关键字均大于关键字;左子树和右子树又各是一棵二叉排序树。
(4)平衡二叉树:树上任一结点的左子树和右子树的深度之差不超过1。

1.3.二叉树的性质
(1)非空二叉树上的叶子结点数等于度为2的结点数加1,即n0=n2+1。
(2)非空二叉树上第k层上至多有2^(k-1)个结点(k>=1)。
(3)高度为h的二叉树至多有2^h-1个结点(h>=1)。
(4)具有n个(n>0)结点的完全二叉树的高度为[log2(n+1)]或[log2n]+1。

2.二叉树的存储结构
2.1.顺序存储结构
定义:二叉树的顺序存储是指用一组地址连续的存储单元依次自上而下、自左而右存储完全二叉树上的结点元素,即将完全二叉树上编号为 i 的结点元素存储在一维数组下标为 i-1的分量中。
(1)根据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映结点之间的逻辑关系,这样既能最大可能地节省存储空间,又能利用数组元素的下标值确定结点在二叉树的位置,以及结点之间的关系。
注意:对于一般二叉树,为了让数组下标能反映二叉树中结点之间的逻辑关系,只能添加一些并不存在的空结点,让其每个结点与完全二叉树上的结点相对应,再存储到一维数组的相应分量中。

2.2.链式存储结构
由于顺序存储结构的空间利用率较低,因此二叉树一般都采用链式存储结构,用链表结点来存储二叉树中的每个结点。在二叉树中,结点结构通常包括若干数据域和若干指针域,二叉链表至少包含3个域:数据域data、左指针域lchild 和 右指针域rchild。
注意:在含有 n个结点的二叉链表中,共有2n个指针域,含有 n+1个空链域,n-1个指针域。
在这里插入图片描述
二叉树的链式存储结构描述如下:

typedef struct BiTNode{
    ElemType data; //数据域
    struct BiTNode *lchild,*rchild; //左、右孩子指针
}BoTNode,*BiTree;
  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白_xm

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值