数据结构第五章学习小结

一、本章学习内容小结:本章学习了新的数据结构--树,与前面的学习不同的是,树是一种非线性结构,树只有一个根结点,其子树本身也是一棵树,所以其定义是递归定义。本章还学习了二叉树和哈夫曼树。

二叉树:结点的度不超过2的树,其中完全二叉树是每个结点都与深度为k的满二叉树编号相同。遍历二叉树是对数的基本操作,分为先序、中序和后序,而建立二叉链表、复制二叉树、求二叉树的结点以及统计二叉树结点的个数都用到了递归的思想。

哈夫曼树:带权路径长度最短的树,通过构造哈夫曼树对符号进行编码。

 

二、重点

1、二叉树的性质:

1)二叉树的第i层至多有2^i-1)个结点;

2)深度为k的二叉树至多含有2^k-1个结点;

3)n0(度为0的结点)=n2(度为2的结点)+1

//通过总结点数的奇偶可确定是否含有度为1的结点

4)具有n个结点的完全二叉树的深度为|_log2 n_|+1;

5)对完全二叉树,若从上至下、从左至右进行编号,则编号为i的结点,其左孩子编号必为2i,右孩子编号必为2i+1,双亲为i/2

2、二叉树操作的算法:遍历、建立二叉链表、复制二叉树、统计二叉树的结点个数

*层次遍历

typedef struct biTNode
{ 
    TElemType data; 
    struct biTNode *lchild;
    struct biTNode *rchild; 
}BiTNode, *BiTree;

void fun(BiTree T) 
{ 
    queue q;
    q.push(T);
    BiTNode *p; 
    while (!q.empty()) 
   { //q非空则继续访问队列
        p = q.front();
        q.pop();
        if (p!=NULL)
       { 
            cout << p->data;
            q.push(p->lchild);
            q.push(p->rchild); 
       } 
    } 
}

3、树的存储结构

1)孩子双亲表示法

typedef struct CNode
{//孩子结点 
     int child;
     CNode *next;
 } CNode;
 typedef struct
 {//双亲结点
      int parent;
      char data;
      CNode *firstchild;//双亲结点指向第一个孩子
 }PNode;
 typedef struct
 {
      PNode nodes[MAXSIZE];
      int root;
      int n;
  } Tree;

2)孩子兄弟表示法(树合并为森林)

typedef struct CSNode{
    int data;
    CSNode* firstchild;
    CSNode* nextsibling;
}CSNode;

4、哈夫曼树

结点定义

typedef struct { 
    int weight; //权值
   int parent, lch, rch;
 } *HuffmanTree;

三、易错点小结

1. typedef TElemType SqBiTree[MAXTSIZE];

// 定义了一个新类型,名字为 SqBiTree,其本质是一个数组,数组元素类型是 TElemType,长度为 MAXTSIZE

如:int a[100]; int b[100] <---> typedef int Num[100] ; Num a,b;

 
2.int n; cin >>n ; int *a = new int [n] ;//在堆申请空间,长度为 n的int类型数组,语法正确 (人工分配,人工回收)
  int n; cin >> n; int a[n] ; // 定义数组时,数组长度为变量,但n的值可能过大,超过栈空间的大小,C 语言正确,但 C++不支持。

四、心得体会

本章学习的内容与之前相比是新内容,在刚开始学习的时候觉得有点难理解,需要继续努力!

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