数据结构第五章学习小结
一、学习内容小结
二叉树的性质:
①第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
二、学习心得
在本章内容的学习过程中,感到比较困难的部分是哈夫曼树的构造,光看书也有点懵,可能是不够完整,于是再结合网课视频以及网上查找资料之后才慢慢理解了。第二个就是线索二叉树,看完书上的内容之后我再去网上查找相关资料,但是感觉这个知识点好像用得并不多,有点没明白它的用处,有点懵。
作业方面,在看了老师教你打代码的视频之后结合自己的思考,掌握得算是都还可以;
下一章的学习中,希望自己可以提高效率,不要一道题花太多不必要时间,毕竟分组协作、测验等等都是限时完成的。