当前位置:文档之家› 第7章 树和二叉树(2)

第7章 树和二叉树(2)

需要针对二叉树的特点稍做改变
3/50
2次树是度为2的树,至少有3个结点;二叉树的结点个数可以为0。 2次树中度为1的结点的孩子不分左、右孩子;而二叉树中度为1 的结点的孩子需要区分左、右孩子。
4/50
两种特殊的二叉树
满二叉树:在一棵二叉树中: 如果所有分支结点都有双分结点; 并且叶结点都集中在二叉树的最下一层。
① 二叉树中所有非叶结点的度数都为2的二叉树是满二叉树(错);
② 一个高度为h的满二叉树中,只在h层有叶结点,而且每一个非叶子结点都
是满的,是满二叉树(对)。
6/50
完全二叉树:在一棵二叉树中:
最多只有下面两层的结点的度数小于2 并且最下面一层的叶结点都依次排列在该层最左边的位置上。
1
A
2
B
4
D
16/50
1、森林、树转换为二叉树
A

颗 树
B
C
D


E
F
G



H

长子关系转换为左孩子关系 兄弟关系转换为右孩子关系
A B
C
E
D
F
H
G
对应的二叉树
17/50
A
E
G
B
C
D
F
H
I


A
G



B
E H
为 一
C
F
I

D
二 叉
A

B
E
C
F
D
对应的二叉树
G H
I
18/50
或者
A
E
B
C
D
F
G
H
I
按一颗树的方法转换,再删除增加的结点
二叉树抽象数据类型 = 逻辑结构 + 基本运算
37/50
将二叉树的二叉链结点类型及其基本运算函数存储在btree.cpp文件中
应用示例
创建以下二叉树的二叉链存储结构b: 求其高度 查找是否存在'F'结点
A
B
C
D
E
F
G
38/50
B D
G
A C
E
F
A(B(D(,G)),C(E,F))
b A
B∧
C
∧D
2、二叉树还原为森林、树

A

棵 二
B

树 还
C
D

为E
F
G
H



A
B
D
H
C E
F
G
还原的树
左孩子关系恢复为长子关系 右孩子关系恢复为兄弟关系
22/50
将 一
A

二 叉
B
E


C
F
G

为 多
D
H
棵 树
I
A
B C D
E
F G
H I
转 换 为 棵 二 叉 树
23/50
3
A
B C D
E
F G
H I
A
B
C
D

E


3
F
棵 树
G
H
I
24/50
示例
高度为3的满二叉树B,将其还原为森林T,其中包含根结点的那棵树 中必定有( )结点。
A.1
B.2
C.3
D.4
答案为D。
25/50
示例
设x是树T中的一个非根结点,B是T所对应的二叉树。在B中,x是其双亲结 点的右孩子,下列结论正确的是( )。
A.在树T中,x是其双亲的第一个孩子 B.在树T中,x一定无右边兄弟 C.在树T中,x一定是叶子结点 D.在树T中,x一定有左边兄弟
完全二叉树的叶子结点只能在最下两层,对于本题,结点最多的情况是第6 层为倒数第二层,即1~6层构成一个满二叉树,其结点总数为26-1=63。
其中第6层有25=32个结点,含8个叶子结点,则另外有32-8=24个非叶子结 点,它们中每个结点有两个孩子结点(均为第7层的叶子结点),计48个叶 子结点。这样最多的结点个数=63+48=111。
printf("b的高度: %d\n",BTHeight(b));
p=FindNode(b,'F');
if (p!=NULL)
printf("b中存在F结点\n");
else
printf("b中不存在F结点\n");
DestroyBTree(b);
}
40/50
(2)销毁二叉链DestroyBTree(*b)
答案为C。
15/50
示例
一棵完全二叉树中有8个叶子结点,则高度至多是( )。
A.3
B.4
C.5 D.不确定
该完全二叉树,n0=8,n2=n0-1=7,则n=n0+n1+n2=15+n1。 完全二叉树中n1=0或n1=1,则n1=1时结点个数最多,此时n=16。 最大高度h=log2(n+1)=5。 答案为C。
当n确定时,n0、n1、n2都是确定的,其树形也可以确定! h=log2(n+1)或者log2n+1
14/50
示例
已知一棵完全二叉树的第6层(设根为第1层)有8个叶子结点,则该完全 二叉树的结点个数最多是( )。
A. 39
B. 52
C. 111
D. 119
2009年全国计算机专业硕士学位研究生考试题目
示例
设一棵二叉树B是由森林T转换而来的,若T中有n个非叶子结点,则二
叉树B中无右孩子的结点个数为( )。
A.n-1
B.n
C.n+1
D.n+2
T中每个非叶子结点一定有一个最右孩子x(只有
一个孩子结点x时,x就是最右孩子)。
n
在转换的B中,x一定无右孩子。
T的根结点在B中一定无右孩子。
1
答案为C。
21/50
2i
2i+1
31/50
借鉴树的孩子链存储结构 二叉树的链式存储结构。 在二叉树的链式存储中,结点的类型声明如下:
typedef struct node { ElemType data;
struct node *lchild, *rchild; } BTNode;
指向的都是二叉树:递归性
32/50
5
E
8
9
10
11
H
I
J
K
6
F
3
C
7G
满的
完全二叉树实际上是对应的满二叉树删除叶结点层最右边若干个结点得到的。
7/50
性质1 非空二叉树上叶结点数等于双分支结点数加1。即:n0=n2+1。
A
B
C
D
E
F
G
度之和=分支数 分支数=n-1 nn2
n0+n1+n2-1=n1+2n2
二叉树是有限的结点集合。
递归 定义
这个集合或者是空。
或者由一个根结点和两棵互不相交的称为左子树和右子树的二叉树组成。
1/50
二叉树的5种基本形态: 空树
只含根结点
N
右子树为空树
N
左子树为空树
N
左右子树均 不为空树
N
L
R
L
R
2/50
二叉树是可以采用树的逻辑结构表示法,其4种表示法如下: 树形表示法 文氏图表示法 凹入表示法 括号表示法
}
}
42/50
(3)查找结点FindNode(*b,x)
设f(b,x)在二叉树b中查找值为x的结点(唯一)。找到后返回其指针, 否则返回NULL。
A.16
B.18
C.20
D.30
n2=7, n1=5 n0=n2+1=8 结点总数n=n0+n1+n2=20。 答案为C。
10/50
性质2 非空二叉树上第i层上至多有2i-1个结点(i≥1)。 由树的性质2可推出。
性质3 高度为h的二叉树至多有2h-1个结点(h≥1)。 由树的性质3可推出。
11/50
10
8
9
11
12 13 14

#
#
#
##
#F





1 2 3 4 5 6 7 8 9 10 11 12 13 14
ABD#C#E######F
typedef ElemType SqBTree[MaxSize]; SqBTree bt="#ABD#C#E######F";
用一个数组存储
30/50
二叉树顺序存储结构的特点:
4
56
7

D
E
F
G


8
9
10
11

H
I
J
K





1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ABCDEFGHIJK####
顺序存储结构(不用下标为0的元素)
29/50
1
A
一般的二叉树先用空结
点补全成为完全二叉树,
2

B
3
D
然后对结点编号


4
5
6
7
相关主题