数据结构第五章学习小结

一、学习内容小结

二叉树的性质:

①第i层上至多有2^(i-1)个结点

②深度为k的二叉树至多有2^k - 1个结点

③对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1

④具有n个结点的完全二叉树的深度为log(2)(n)(向下取整)+1

相关课堂提问(之前不太会的题目):

1.一棵完全二叉树有201个结点,叶子结点数为:

n = n0 + n1 + n2 ; 由完全二叉树性质可知,若给每个结点专依次序标上1~n序号,序号为 i 的结点(假设有两个孩纸存在)其左孩纸序号为 2i(皆为偶数),右孩纸序号为 2i + 1 (皆为奇数属)

201为右孩子,父结点为100(2i+1=201),即n2=100;

n1=0,所以n0=101

 

2.258个结点的满二叉树高h为:log(2)(258)≈9,所以9<=h<=258

 

3.在一棵度为3的树T中,有10个度为3的结点,1个度为2的结点,10个度为1的结点,则叶结点个数为:

分支数目 = 10*3 + 1*2 + 10*1 = 42

结点总数 = 分支总数 + 1 = 43

n = n0 + n1 + n2 + n3, n0 = 22;

 

遍历二叉树:

分为:先序遍历、中序遍历、后序遍历等(只要改变输出语句的顺序,就可以类似的实现其他两种遍历算法)

 

 

 类型定义:

 1 #define MAXSIZE 100
 2 
 3 typedef struct TreeNode
 4 {
 5      char data;    //数据域 
 6      int lch;     //左孩子的位置 
 7      int rch;    //右孩子的位置 
 8 }TreeNode;
 9 
10 typedef struct Tree
11 {
12      TreeNode tree[MAXSIZE];   //TreeNode类型的数组 
13      int root;     //根结点的位置   
14 }Tree;
15 
16 void InOrderTraverse(Tree T)
17 {//先序遍历树
18      int a = T.root;
19      if(T.root!=-1) 
20      {
21           cout << T.tree[T.root].data;
22           T.root = T.tree[a].lch;
23           InOrderTraverse(T);
24           T.root = T.tree[a].rch;
25           InOrderTraverse(T);
26      }
27 }                        

 

 

 (课堂小结的方法,思路相同,代码更为简洁。)

创建二叉树(若输入‘#’则为空树):

 1 void CreateBiTree(BiTree &T)
 2 {
 3     char ch;
 4     ch = getchar(); //输入可读取空格等字符
 5     if (ch=='#')  T = NULL;
 6     else
 7     {
 8         T = new BiTNode;
 9         T->data = ch;
10         CreateBiTree(T->lchild);
11         CreateBiTree(T->rchild);
12     }
13 }

记得destory!

1 void Destroy(BiTree T)
2 {
3     if(T==NULL) return;
4     Destroy(T->lchild);
5     Destroy(T->rchild);
6     delete T;
7 }

 

哈夫曼树:一类带权路径长度最短的树

树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。

 

类型定义:

1 //哈夫曼树结点结构
2 typedef struct
3 {
4     int weight;//结点权重
5     int parent, left, right;//父结点、左孩子、右孩子在数组中的位置下标
6 }HTNode, *HuffmanTree;

关于构造哈夫曼树的学习,我在网上查找了资料,参考http://c.biancheng.net/view/3398.html

 

二、学习心得

在本章内容的学习过程中,感到比较困难的部分是哈夫曼树的构造,光看书也有点懵,可能是不够完整,于是再结合网课视频以及网上查找资料之后才慢慢理解了。第二个就是线索二叉树,看完书上的内容之后我再去网上查找相关资料,但是感觉这个知识点好像用得并不多,有点没明白它的用处,有点懵。

作业方面,在看了老师教你打代码的视频之后结合自己的思考,掌握得算是都还可以;

下一章的学习中,希望自己可以提高效率,不要一道题花太多不必要时间,毕竟分组协作、测验等等都是限时完成的。

 

posted @ 2020-05-28 13:32  冯颖欣  阅读(291)  评论(0编辑  收藏  举报