二叉树的定义
一个有穷的结点集合。这个集合可以为空,若不为空,则由根节点和称为其左子树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个子结点。如下图: