数据结构递归树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
b
-
c
d
链式存储
A
^ B
lchild Data C ^
rchild
D
^ E
^ F ^
^
G
^
^
H ^
typedef struct BiTNode{ Elemtype data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;
lchild Data rchild
4 5 6 7
满二叉树:深度为k且共有2k-1个结点
2 完全二叉树 •叶结点出现在最高或次高层
1 3
•对于任意结点,如果
4 5
C(Tr)=s,则C(Tl)=s或s+1
1
2 3 5 6 2
6 1
7
1
3 5 2
3 6 7
4
4
7
(a)完全二叉树
(b)非完全二叉树
( c)非完全二叉树
性质4 具有n个结点的完全二叉树深度为 log2 n 1
-
/ f
*
e
-
c
d
叶结点个数
int Sumleaf(BiTree T){ int sum=0,m,n; if(T){ if((!T->lchild)&&(!T->rchild)) sum++; m=Sumleaf(T->lchild); sum+=m; n=Sumleaf(T->rchild); sum+=n; } return sum; }
-
+ e
/ f
*
b
-
c
d
线索化二叉树
A
^ ^ B
C ^
^
^ D ^
^ E ^
中序遍历BDAEC
lchild
ltag
data
0 A 0
rtag
rchild
^ 1 B 0
0
C 1
^
1 D 1
1 E 1
中序遍历BDAEC
树的存储表示
a
firstc
data
nexts
b
c
d
e
f
g
h
i
j
k
l
m
森林转化为二叉树
1 2 4 5 3 2 6 4 5 4 5 6 7 1 3 1
2
3
遍历二叉树
1 2
D L R
3
4
5ቤተ መጻሕፍቲ ባይዱ
6
7
DLR——先(根)序遍历 LDR——中(根)序遍历 LRD——后(根)序遍历
二叉树表达式 (a+b*(c-d)-e/f) 其先序序列为: -+a*b-cd/ef
a
-
+ e
/ f
*
其中序序列为: a+b*c-d-e/f 其后序序列为: abcd-*+ef/-
a f h
b
c
d
g
i
j
e
k
路径长度:结点间的分支数 0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4….
1 2 4 8 4 5 6 3 7
0,1,1,2,2,2,3,3
1
2
3
5
7
6 8
n个结点,高为k,从根到k-1层最多有2k-1-1个 点,其余分布在第k层,最小路径长度
Huffman Tree
当i=1时,只有一个根结点,2i-1=20 =1,命题成立。 对于j=i-1,假定命题成立,则第j层上至多有2j-1个结点, 故第j+1层上最多有2j-1*2即2j个结点,即第i层上最多 有2i-1个结点。 证毕。
1 2 3
i-1
4
5
6
7
性质3: 对任何一棵二叉树,如果其叶结点数n0,度 k-1个结点(k>=1). 性质 2 :深度为 k 的二叉树至多有 2 为2的结点数为n2,则n0=n2+1。 k 证明: i 1 2 i 1 设二叉树中度为1的结点数为 n1,有: N=n0+n1+n2 (1) 设B为二叉树中的分支总数,则有B=N-1,同时 B=n1+2n2,于是有 1 N=n1+2n2-1 (2) 故 2 3 n0=n2+1
e b e
a c f d g
a b f c g d
a d g
n个结点的集合,T:
二叉树
T=
,
n=0
T左+T右,n>0
A B (a) A A B B A C (e) 根和左右子树
(b) (c) (d) 根和空的 空二叉树 左右子树 根和左子树 根和右子树
二叉树的性质
性质1: 在二叉树的第i层上至多有2 个结点 (i>=1)
A
^
D
^ F
^
G
^
ABC##DE#G##F###
-+a##*b##-c##d##/e##f##
-
+ e
/ f
a
*
b
-
c
d
前序遍历
void Preorder(BiTree T){ if(T){ cout<<T->data; + Preorder(T->lchild); Preorder(T->rchild); a } b }
部分地包含自身,直接或间接地调用自身 定义递归:
1 n! n(n 1)! n0 n0
0 参数 1 1 参数 2 2 参数 3 3 主程序main() 计算 3*Factor(2) 返回 6 计算 2*Factor(1) 返回 2 计算 1*Factor(0) 返回 1
参数 0
计算 0!=1
T BiTree Create(BiTree T) { char ch; B cin>>ch; if(ch=='#') T=NULL; ^ C ^ else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) cout<<"Error!"; ^ E T->data=ch; T->lchild=Create(T->lchild); T->rchild=Create(T->rchild); } ^ return T; }
2k-1-1<n<=2k-1
2k-1<=n<2k
k log2 n 1
1 2 4 5 3
性质5: 如果对一棵有n个结点的完全二叉树的结 点从高到低从左到右编号,则对任一结点i,有: 1)i=1,则i无双亲,是根;i>1,则双亲【i/2】; 2)2i>n,则i为叶子;否则,其左孩子是2i; 3)如果2i+1>n,则结点i无右孩子;否则,其右 孩子是结点2i+1。
返回 1
long Factor (long n) { if(n==0) return 1; else return n*Factor(n-1);
}
6
数据结构递归:
typedef struct tNode{ Elemtype data; tNode *next; }tNode,*link; tNode newnode; link list;
^
^
^
树
n个结点的有限集合,n>1,T: 1. 一个根结点root 2.
T1 T2 Tm {T root} T1 T2 Tm
1
n=0
1
2 5 6
3
4 7
n=1
树的术语 结点=数据项+分枝 叶、分支、子女、双亲、兄弟 祖先、子孙 结点的度 树的度 结点所处层次 树的高度 有序树、无序树 森林
-
+ e
/ f
a
*
b
-
c
d
树的深度
int Depth(BiTree T){ int dep=0,depl,depr; if(!T) dep=0; else{ a depl=Depth(T->lchild); depr=Depth(T->rchild); dep=1+(depl>depr?depl:depr); } return dep; }
T有n个叶结点,权值w0,…wn-1,扩充二叉树
T的带权路径长度: WPL wi li
i 0 n 1
72 2 4
5
7
54
WPL最小的二叉树
52
74
构造Huffman Tree
CAST CAST SAT AT A TASA
18 11
7 5 2
C,A,S,T : 2,7,4,5
6
0 4 7 0 5 0
18
1
11
1
6
1 4 2
A:0,T:10, C:110, S:111
18
0 7 1
11
0
5 0 2
1
6
1 4