浙大数据结构——3.2二叉树及存储结构

二叉树的定义

一个有穷的结点集合。这个集合可以为空,若不为空,则由根节点和称为其左子树TL和右子树TR的两个不相交的二叉树组成。

1、五种基本形态:空、一个结点、一个结点+左子树、一个结点+右子树、一个结点+左子树+右子树。

2、二叉树的子树有左右顺序之分。

3、特殊二叉树:斜二叉树、完美二叉树(满二叉树)、完全二叉树

二叉树的几个重要性质

1、一个二叉树第i层的最大结点树为:2^(k-1),i>=1。

2、深度为k的二叉树有最大结点总数为:2^k-1,k>=1。

3、对任何非空二叉树T,若n0表示叶结点的个数、n2是度为2的非叶结点个数,那么两者满足关系n0=n2+1。

因为 总边数 = n0 + n1 + n2-1 = 0*n0 + 1*n1 + 2*n2,解方程可得 n0=n2+1。

Q:有一颗二叉树,其两个儿子的结点个数为15个,一个儿子的结点个数为32个,问该二叉树的叶结点个数是多少?

A:16个。两个儿子的结点个数,意思是度为2的结点有15个,即n2=15;一个儿子的结点个数,意思是度为1的结点有32个,即n1=32。由n0=n2+1知,n0=16。

 二叉树的抽象数据类型定义

类型名称:二叉树

数据对象集:一个有穷的结点集合,若不为空,则由根节点和左、右二叉子树组成。

操作集:

1、判断二叉树是否为空。

2、遍历:

(1)先序——根、左子树、右子树

(2)中序——左子树、根、右子树

(3)后序——左子树、右子树、根

(4)层次遍历——从上到下、从左到右

3、创建一个二叉树。

Q:在二叉树中,我们知道叶结点总数 n0 与有两个儿子的结点总数 n2 之间的关系是:n0=n2+1.。那么类似关系是否可以推广到m叉树中?也就是,如果在m叉树中,叶结点总数是 n0,有一个儿子的结点总数是 n1,有2个儿子的结点总数是 n2,有3个儿子的结点总数是 n3,...。那么,ni之间存在什么关系?

A:n0 = n2 + 2n3 + ... + (m - 1)nm+1

二叉树的存储结构

一、顺序存储结构

1、完全二叉树。完全二叉树适用于数组表示,因为从上到下、从左到右可以按顺序标号,即可对应数组的下标。

如果需要根据序号找到其父结点、左右儿子,则可按照如下规则查找:(设树的结点有n个,已经结点的序号为 i

(1)除了根结点外,结点 i 的父结点序号为 i / 2 。

(2)结点 i 的左孩子序号为  2i (若 2i > n,则不存在左孩子)。

(3)结点 i 的右孩子序号为  2i + 1(若 2i + 1 > n,则不存在右孩子)。

2、一般二叉树。一般二叉树也可以用完全二叉树的形式表示,即在缺少元素的位置用空补充,但是容易导致空间浪费。

二、链表存储

结构体:

typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
	ElementType Data;
	BinTree Left;
	BinTree Right;
};

Q:如果一个完全二叉树最底下一层为第六层(根为第一层)且该层共有8个叶结点,那么该完全二叉树共有多少个结点?

A:39个。最底层为6,则前面5层必然是满的,共有2^5-1=31个结点,加上第六层的8个,总共39个结点。

Q:若有一二叉树的总结点数为98,只有一个儿子的结点数为48,则该树的叶结点数是多少?

A:这样的树不存在。总结点数=n0+n1+n2=98,已知n1=48,n2=n0-1,,代入得n0=51/2,故这样的树不存在。

Q:设深度为d(只有一个根结点时,d为1)的二叉树只有度为0和2的结点,则此类二叉树的结点数至少为2d-1。

A:正确。如果从第一层开始添加结点,那么一个结点只能添加0个或者2个的子结点。按照最少个数来添加,每增加一层则在上一层的一个结点添加2个子结点。如下图:

  • 18
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值