一、内容小结
第五章学习了:树(用到递归的思想最多了),主要学的是二叉树的各种算法以及哈夫曼树的分析。
1)二叉树的各种性质感觉在这章中比较重要,第一点是在二叉树的 第l层上至多有2^(i-l) 个结点,第二点是深度为K的 二叉树至多有 2k -1 个结点,第三点是n0(度为0的结点)=n2(度为2的结点)+1(还有一个点:结点总数 = 分支总数+1)
2)哈夫曼树(带权路径长度最短的树)的构造:方法:先选两个权值最小的作为结点进行合并,形成一个树的分支,然后把这两个结点的权值相加作为根节点的权值,接着把父节点与另一个最小权值合并,方法和之前的一样,后面的以此类推,直到把所有权值都用上,这样最终就构造出一个哈夫曼树了。带权路径长度WPL=所有叶子结点各自乘以从树根到它们的路径长度(即边数)再相加。
二、易错点
1、在最开始学树的时候,我有些分不清叶子结点(叶结点)和结点的区别,现在明白了,叶子结点是指没有孩子的结点,而结点包括叶子结点,结点是可以有孩子的(即有分支)。
2、二叉树的先序序列、中序序列以及后序序列会容易弄混。先序是先遍历根再遍历左子树最后再遍历右子树。中序是先左再根最后右。后序是先左再右最后根。(它们遍历的要求都是要把整个小部分遍历完才能往上一层去遍历(感觉有点难形容,但是我自己还是明白的))
3、int n; cin >>n ; int *a = new int [n] ;//在堆申请空间,长度为 n的int类型数组,语法正确 (人工分配,人工回收)
int n; cin >> n; int a[n] ; // 定义数组时,数组长度为变量,但n的值可能过大,超过栈空间的大小,C 语言正确,但 C++不支持。
4、typedef TElemType SqBiTree[MAXTSIZE];
// 定义了一个新类型,名字为 SqBiTree,其本质是一个数组,数组元素类型是 TElemType,长度为 MAXTSIZE
如:int a[100]; int b[100] <---> typedef int Num[100] ; Num a,b;
三、重点算法:
1、遍历算法:(基于二叉树)
层次遍历
typedef struct { int lch; int rch; }Node; typedef struct { Node data[10]; int root;//根结点 }Tree; void LevelOrder(Tree T) { queue<int> Q;//队列 Q.push(T.root);//根结点入队 int k; bool flag =false; while(!Q.empty())//判断队是否空 { k = Q.front();//获取队头 Q.pop();//队头元素出队 (把队头元素删去) if(T.data[k].lch==-1 && T.data[k].rch==-1)//没有孩子 { if(flag==false) { cout << k; flag =true; } else cout << " "<< k; } else { if(T.data[k].lch!=-1) Q.push(T.data[k].lch); if(T.data[k].rch!=-1) Q.push(T.data[k].rch); } } }
中序遍历
void InOrder(BiTree T)//中序遍历输出 { if(T) { InOrder(T->lchild);//遍历左子树 ① cout << T->data;//访问根节点 ② InOrder(T->rchild);//遍历右子树 ③ } }
先序和后序与中序差不多,就是遍历左右子树的位置不一样(①②③不一样)。先序:②①③ 后序①③②
2、先序建立二叉树
void creat(BiTree &T) { T=new BiTNode; cin >> T->data; if(T->data=='#') T= NULL; if(T!=NULL)//如果T不是空 { creat(T->lchild);//输入左指针 creat(T->rchild);//输入右指针 } }
3、孩子双亲表示法
typedef struct CNode//孩子结点 { int child;//孩子编号 CNode* next; }CNode; typedef struct PNode//双亲结点 { int parent; char data; CNode* fchild;//指向第一个孩子结点的指针 }PNode; typedef struct { PNode a[MAXSIZE]; int root;//根节点编号 int n;//结点个数 }Tree;
4、孩子兄弟表示法
typedef struct CSNode{ int data; CSNode* firstchild;//孩子 CSNode* nextsibling;//兄弟 }CSNode;
5、哈夫曼树结点类型定义
typedef struct { int weight; //权值 int parent, lch, rch; } *HuffmanTree;
四、心得体会
感觉树这一章只是看+不写代码的话还是比较容易理解,但是真的写代码时类型定义以及递归那部分(特别是创建树的函数)有时真的有点无法入手,可能还得自己多写写。还有就是通过这次小组合作发现有些知识点不记得(比如说上面易错点3)以及完成限时任务时最好不要用自己不熟练的东西(链表)。