第五章学习小结

一、内容小结

主第五章要学了树、二叉树、哈夫曼树、森林的内容,难度较大,不少算法代码都涉及递归函数,令人头秃。

//先序建立二叉链表
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,调试的时候竟然没能帮忙检查出来,害。

 

三、下阶段目标

看书一定要仔细,先预习后看视频,不能和上周那样马虎,递归学不好就再看看,不要丧,好好学图,跟上进度!

你可能感兴趣的:(第五章学习小结)