- 37
- 0
- 约2.92万字
- 约 25页
- 2016-10-12 发布于贵州
- 举报
数据结构辅导212树型结构
数据结构辅导2012
树形结构部份:
基本知识点:树的定义及相关术语、树的表示及树的性质。二叉树的定义、二叉树的性质、满二叉树和完全二叉树的定义、二叉树的顺序存储和链式存储、二叉树的遍历过程、二叉树的线索化过程、哈夫曼树的定义与构造方法以及二叉树与森林之间的转换。
递归的相关概念。
重点:二叉树的性质、二叉树的遍历(二叉树各种遍历方法及它们所确定的序列之间的关系)、二叉树的线索化方法,构造哈夫曼树。
递归模型、递归算法的执行过程和递归设计思想。
难点:二叉树上各种算法特别是递归算法的设计和非递归算法的设计。
将递归算法转化为非递归算法。
(重点要求掌握二叉树的二叉链表存储表示结构下的递归算法。)
树形结构知识体系结构
树
二叉树
二叉树和树
例题:已知A[n]为整数数组,编写一个递归算法,求n个元素的平均值。
解:算法如下:
int average(int A[], int n)
{ if(n==1) return A[0];
else return (average(A,n-1)*(n-1)+A[n-1])/n;
}
例6.2:有一个不带头结点的单链表,其结点类型如下:
typedef int ElemType;
typedef struct node
{ ElemType data;
struct node *next;
}Node;
设计如下递归算法:
(1)求以H为头指针的单链表的结点个数。
(2)正向显示以H为头指针的单链表的所有结点值。
(3)反向显示以H为头指针的单链表的所有结点值。
(4)删除以H为头指针的单链表中值为x的第一个结点。
(5)删除以H为头指针的单链表中值为x的所有结点。
(6)求出以H为头指针的单链表中最大结点值。
(7)求出以H为头指针的单链表中最小结点值。
解:递归算法分别如下:
int Count(Node *H)
{ if(H==0) return 0;
else return 1+Count(H-next);
}
(2) void traverse(Node *H)
{ if(H==0) return;
coutH-data;
traverse(H-next);
}
(3) void traverseR(Node *H)
{ if(H==0) return;
c traverse(H-next);
outH-data;
}
(4) void delFirstx(Node *H, ElemType x)
{ Node *t;
if(H==0) return;
if(H-data==x) { t=H; H=H-next; delete t; return; }
delFirstx(H-next, x);
}
(5) void delAllx(Node *H, ElemType x)
{ Node *t;
if(H==0) return;
if(H-data==x) { t=H; H=H-next; delete t; }
delAllx(H-next, x);
}
(6) ElemType Maxv(Node *H)
{ ElemType m;
if(H-next==0) return H-data;
m=Maxv(H-next);
if(mH-data) return m;
else return H-data;
}
(7) ElemType Minv(Node *H)
{ ElemType m;
if(H-next==0) return H-data;
m=Minv(H-next);
if(mH-data) return m;
else return H-data;
}
例题 一棵完全二叉树上有1001个结点,问其中叶子结点个数是多少?
答案:501
注:n0+n1+n2=n, n-1=n1+2n2, n0=n2+1, n1=0或n1=1;
n=2*n0+n1-1,n=1001, 故n1=0,n0=501。
例题 一棵有124个叶子结点的完全二叉树中,最多有多少个结点?
答案:248
注:n=n0+n1+n2=n0+n1+n0-1=2*n0+n1-1, n1最多为1。n=2*124=248。
例题 设有13 个值,用它们组成一棵哈夫曼树,问该哈夫曼树有多少个结点?
答案:25
注:有m个叶结点的哈夫曼树共有2m-1个结点。2*13-1=25。
例题 问8层完全二叉树至少有多少个结点?
答案:128
注:1+2+4+8+16+32+64+1=128
例题 问拥有100个结点的完全二叉树的最大层数是多少?
答案:7
例题 已知二叉树有50个叶子结点,则该二叉树的结点总数至少是多少?
答案:99
注:n0=n2
原创力文档

文档评论(0)