数据结构—二叉树

本文深入探讨二叉树的概念,包括其与无序树、度为2的有序树的区别,以及二叉树的初始化、遍历等基本运算。同时,介绍了二叉树的链式存储结构——二叉链表和三叉链表,并对比了顺序存储结构,如基于完全二叉树特性的存储和类双亲数组表示法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1认识二叉树

             家谱可以分为两种:一种是二分支结构,另外一种是多分支结构。此处我们讨论具有更高规则的二分支结构

1.1.1二叉树的定义

             二叉树是由n个结点构成的有限集合。它可以为空,称为空二叉树,也可以不为空,则它是由一个根节点以及一个被称为根的左子树和根的右子树的两个互不相交的结点集构成,其中左右子树本身又是二叉树

            根据定义可知二叉树具有如下五种形态:

            

           1.二叉树与无序树的区别

            二叉树的结点度取值范围为[0,2];而在无序树中结点度的取值范围为[0,n-1]。此外,二叉树的子树是有左右之分的,而无序树中的子树是无次序之分的。

            2.二叉树与度为2的有序树的区别

            在度为2的有序树中,若某个结点只有一个孩子,那么无需区分这个孩子是该结点的左孩子还是右孩子;但在二叉树中,即使某个结点只有一个孩子,也要区分这个孩子是该结点的左孩子还是右孩子

1.1.2二叉树的基本运算

            在二叉树的逻辑结构基础上定义的操作主要有以下几种:

初始化、判空、创建、求高度、访问树根、查找、访问双亲、访问左孩子、访问右孩子、访问子孙、访问祖先、遍历、输出/打印、撤销、先序遍历、中序遍历、后序遍历、层次遍历

1.1.3二叉树的性质

性质1:叉树第k层上至多有2的k-1个结点(k大于等于1)

性质2:高度为h的二叉树至多有2的h次方减1个结点(h大于等于1)

性质 3:设二叉树叶子结点数为A,度为2的结点数为B,则有:A=B+1

(1)、满二叉树

高度为h且具有2的h次方减1个结点的二叉树;

每一层都充满的二叉树;

没有度数为1的结点,且叶子结点均分布在最大层的二叉树

(2)、完全二叉树

除去最大层是一棵满二叉树;

最大层的结点向左充满

1.2二叉树的实现

          1.二叉树的链式存储结构

          二叉树具有很强的结构特点,它的每个结点至多都有两个孩子,因此可以用指针指向它的两个孩子。二叉树的这种链式存储结构称为二叉链表。每个结点对应的存储映像如下:

类型定义如下:

typedef struct BTNode
{
	DataType data;
	struct BTNode *lchild, *rchild;
}BTNode,* BL_BTree;

 

如下所示该二叉树及其对应的二叉链表存储结构图。整个二叉链表以指向根结点的指针(称为根指针root)为整个存储结构的访问入口

为了使得查找某指定结点的双亲与孩子一样方便,我们可以采用“空间换时间”思想,在下图所示的结点结构中增加一个指针域parent,用它来指向结点的双亲结点。此时,每个结点对应的指针结构包括三个指针域,因此被称为二叉树的三叉链表存储表示法

类型定义如下:

typedef struct BTNode
{
	DataType data;
	struct BTNode *lchild, *rchild, *parent;
}BTNode,* BL_BTree;

如下所示该二叉树及其对应的三叉链表存储结构图:

              2.二叉树的顺序存储结构

              (1)、二叉树基于完全二叉树性质的顺序存储结构

              对完全二叉树进行按层次编号(序号从1开始),那么这种编号本身就包含所有的分支信息以及分支的方向信息,因此我们可以借助这种性质得到二叉树的一种顺序结构。因为该性质试用于完全二叉树,因此在使用时,我们需要利用外部结点(用方框表示)将该二叉树补充为完全二叉树,然后对其进行编号。如下是改造后得到的完全二叉树:

              用一个一维数组存储二叉树中的所有结点信息,结点信息存放在以其编号为下标的位置,外部结点对应的位置存储一个特殊符号(如*)以表示是外部结点。这样处理后,结点之间的关系信息就隐含存储在结点的编号中。这种顺序存储结构如下:

            (2)、类双亲数组表示法

             在类双亲数组表示法中,每个结点对应的存储映像如图:

            

tag域用来存放标识结点是其双亲的左孩子还是右孩子的标签。

1.2.4方案的比较

             就适应范围和灵活度来说,二叉树的链式存储结构比二叉树的顺序存储结构的使用范围更广、更灵活。二叉链表和三叉链表是二叉树的两种链式存储结构,它们均使用于所有二叉树。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值