数据结构第五章小结

一、内容小结

第五章学习了:树(用到递归的思想最多了),主要学的是二叉树的各种算法以及哈夫曼树的分析。

1)二叉树的各种性质感觉在这章中比较重要,第一点是在二叉树的 l层上至多有2^(i-l) 个结点,第二点是深度为K的 二叉树至多有 2k -1 个结点,第三点是n0(度为0的结点)=n2(度为2的结点)+1(还有一个点:结点总数 = 分支总数+1)

 

2)哈夫曼树(带权路径长度最短的树)的构造:方法:先选两个权值最小的作为结点进行合并,形成一个树的分支,然后把这两个结点的权值相加作为根节点的权值,接着把父节点与另一个最小权值合并,方法和之前的一样,后面的以此类推,直到把所有权值都用上,这样最终就构造出一个哈夫曼树了。带权路径长度WPL=所有叶子结点各自乘以从树根到它们的路径长度(即边数)再相加。

 

二、易错点

1、在最开始学树的时候,我有些分不清叶子结点(叶结点)和结点的区别,现在明白了,叶子结点是指没有孩子的结点,而结点包括叶子结点,结点是可以有孩子的(即有分支)。

 

2、二叉树的先序序列、中序序列以及后序序列会容易弄混。先序是先遍历根再遍历左子树最后再遍历右子树。中序是先左再根最后右。后序是先左再右最后根。(它们遍历的要求都是要把整个小部分遍历完才能往上一层去遍历(感觉有点难形容,但是我自己还是明白的))

 

3int n; cin >>n ; int *a = new int [n] ;//在堆申请空间,长度为 nint类型数组,语法正确 (人工分配,人工回收)

  int n; cin >> n; int a[n] ; // 定义数组时,数组长度为变量,但n的值可能过大,超过栈空间的大小,C 语言正确,但 C++不支持。

 

4typedef 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)以及完成限时任务时最好不要用自己不熟练的东西(链表)。

posted on 2020-05-30 22:47  罗鸾怡  阅读(314)  评论(0编辑  收藏  举报