第五章学习小结
一、内容小结
主第五章要学了树、二叉树、哈夫曼树、森林的内容,难度较大,不少算法代码都涉及递归函数,令人头秃。
//先序建立二叉链表 void CreateBiTree( BiTree &T ) {// 根据读入的先序字符序列,建立二叉树 cin >> ch; if( ch =='#' ) T = NULL; // 递归结束,建空树 else { T = new BiTNode ; T-> data = ch ; // 生成树( ( 子树) ) 的根结点 CreateBiTree (T-> lchild ); // 递归创建左子树 CreateBiTree (T-> rchild ); // 递归创建右子树 } }
void Copy( BiTree T, BiTree & NewT ) {//先序复制二叉树 if (T==NULL) { NewT = NULL; return; } // 递归结束,建空树 else { NewT = new BiTNode ; NewT-> data = T->data ; // 复制根结点 Copy (T-> lchild , NewT -> Lchild ); // 复制左子树 Copy (T-> rchild , NewT -> rchild ); // 复制右子树 } }
int Depth( BiTree T) { //返回二叉树的深度 if(T==NULL) return 0; // 空树,故深度为0 0 else { DepthLeft = Depth(T-> lchild) ); //递归计算左子树的深度 DepthRight = Depth(T-> rchild) ); //递归计算右子树的深度 return (1+max( DepthLeft, DepthRight )); //二叉树的深度则为左、右子树的深度的较大者加1 } }
int NodeCount( BiTree T) { if(T==NULL) return 0; //如果是空树,则结点个数为0 else //结点个数为左子树的结点个数+右子树的结点个数再+1 return NodeCount (T-> lchild) )+ NodeCount (T-> rchild )+ 1; } int NodeCount( BiTree T) {//统计T指向的二叉树的叶子结点个数 if(T==NULL) return 0; //如果是空树,则结点个数为0 if(T->lchild == NULL && T->rchild == NULL) return 1; //叶子结点 return NodeCount(T->lchild)+NodeCount(T->rchild) ; }
void Destory(BiTree T) {//释放二叉树的空间 if(T==NULL) return; Destory(T->lchild);//释放左子树的空间 Destory(T->rchild);//释放右子树的空间 delete T;//释放根结点的空间 }
注:释放空间一定不能忘!
一些注意点:
1、可先将根结点的下标打包到Tree的结构里,方便后续的操作。
typedef struct
{//树类型定义
Node *nodes; //在初始化时使用new来申请空间
int root; //根结点下标
}Tree
2、typedef TElemType SqBiTree[MAXTSIZE];
其作用是定义了一个新类型,名字为 SqBiTree,其本质是一个数组,数组元素类型是 TElemType,长度为MAXTSIZE
eg:
int a[1000];
int array[1000];
typedef int arry[1000];
array a; //此时a的数据类型等同int a[1000]
3、使用哈夫曼算法构造出的二叉树一定是最优二叉树,该算法构造出来的二叉树也称为哈夫曼树。
哈夫曼树虽是最优的,但不一定唯一;调换哈夫曼树同层次的叶子结点,可以获得最优的非哈夫曼树。
二、小组合作与个人测试
经过近几次的测试,感觉自己的代码好臭啊,老是超时,找最深结点时也能没想到层次遍历,思路过于固化,有点挫败感,感觉数构学了个寂寞;
还有低级错误MAXSIZE,调试的时候竟然没能帮忙检查出来,害。
三、下阶段目标
看书一定要仔细,先预习后看视频,不能和上周那样马虎,递归学不好就再看看,不要丧,好好学图,跟上进度!