数据结构第五章学习小结
Posted cxuep
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构第五章学习小结相关的知识,希望对你有一定的参考价值。
一、本章学习内容小结:本章学习了新的数据结构--树,与前面的学习不同的是,树是一种非线性结构,树只有一个根结点,其子树本身也是一棵树,所以其定义是递归定义。本章还学习了二叉树和哈夫曼树。
二叉树:结点的度不超过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<BiTNode *> 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;
四、心得体会
本章学习的内容与之前相比是新内容,在刚开始学习的时候觉得有点难理解,需要继续努力!
以上是关于数据结构第五章学习小结的主要内容,如果未能解决你的问题,请参考以下文章