黄梓财20191003015

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

这一章我们学习了树和二叉树,树是n个结点的有限集,也学习了什么是结点的度(即结点的孩子个数),树的深度(即结点度的最大值),但还是主要学习了二叉树,比如二叉树的性质:

性质1 在二叉树的 第i层上至多有2^(i-l) 个结点(i>=1)。性质2 深度为K的 二叉树至多有 2^k - 1 个结点 (k>=1)。性质3 对任何一棵二叉树T, 如果其终端结点数(叶子数)为n。,度为2的非叶结点数为n2,则n。= n2 + 1

也学习了两种特殊二叉树:完全二叉树(除了叶子结点外的结点都有两个子树)和斜二叉树(只有左或右子树),最重要的是学了定义二叉树的两种结构

顺序结构:  

typedef struct
{
int lch;
int rch;
}Node;

typedef struct
{
Node data[10];//两个孩子
int root;//根结点 编号
}Tree;

链式结构:

typedef struct BiTNode{
int data;//结点数据域
struct BiTNode *lchild,*rchild;//左右孩子指针)

}BiTNode,*BiTree;

后面还学习了遍历二叉树的顺序:先序遍历,中序遍历,后序遍历,层次遍历。其中先,中,后代表的是遍历根结点的顺序,层次遍历则是从上而下,从左而右来遍历

void PreOrderTraverse(BiTree T)
{先序遍历
if(T!=NULL)//该结点不为空
{
cout << T->data;// 访问根节点
PreOrderTraverse(T->lchild);//遍历左子树
PreOrderTraverse(T->rchild);//遍历右子树
}
}其中这个是先序遍历,其他两种的遍历只要把访问根结点的顺序调换一下就可了,但是层次遍历不一样,要用到队列,基本思路是:将根结点入队,根结点的孩子结点入队,根结点出队,孩子结点的孩子入队,孩子结点出队,按照这样来将每一层都进队,出队就可以实现整个树的遍历。

后面还学了二叉链表的构造,就是构造左孩子指针与右孩子指针,不断的递归来构造一棵树。

然后在慕课上还讲到了树的复制以及求结点总数和树的深度,树的复制其实就是树的遍历,而求结点总数就是要不断的递归左右子树,而求树的深度也是一样,不断递归两个子树最后返回最大值

最后还讲到了一棵特殊的树:哈夫曼树,它的带权路径长度最短,所以它的构造与普通的树不一样

void CreateHuffmanTree(HuffmanTree &HT,int n)
{//构造哈夫曼树 HT
if(n<=l) return;
m=2*n-l;
HT=new HTNode[m+l);//0 号单元未用,所以需要动态分配 m+l 个单元, HT[m)表示根结点
for(i=l;i<=m;++i)//将l~m号单元中的双亲、左孩子,右孩子的下标都 初始化 为0
{
HT[i] .parent=O;
HT[i] .lchild=O;
HT[i] .rchild=O;
}

posted on 2020-05-31 17:14  黄梓财  阅读(125)  评论(0编辑  收藏  举报