第五章小结

第五章的内容是树以及二叉树。

1、树的定义:1)有且只有一个根结点。 2)除根结点以外的结点互不相交。

 

 

2、树的基本术语:

1)结点

2)结点的度:结点拥有的子树

3)树的度:各结点度的最大值

4)叶子

5)树的深度:树中结点的最大层次

6)完全二叉树:在存储时可通过对编号的计算找到父、子结点的对应编号

7)满二叉树(深度为K,且含有2的k次方-1个结点)

 

3、二叉树(结构最简单、规律性强,所有树都可以化成唯一的二叉树)

1)二叉树每个结点至多有两颗子树

2)性质:第i层至多有2的i-1次方个结点;深度为k的二叉树至多有2的k-1次方个结点;对任意一颗二叉树其终端结点为n0,度为2的结点树为n2,则n0=n2+1;

 

4、二叉树的存储结构(结点间的关系蕴含在存储位置 不容易实现增加删除)

1)顺序存储结构(线性,某个结点的父/子结点,按照完全二叉树down right 的编号利用下标计算)

但是遇到稀疏的树,会造成空间的极大浪费

2)链式存储结构(在含有n个结点的二叉链表中必有2n个链域,有n-1个非空,则有2n-(n-1)个空链域)

//结点的定义
typedef struct bitnode{
    telemtype data;
    struct bitnode *lchild,*rchild;  //递归
}bitnode, *bitree;

5、遍历

1)先序遍历 (根 左 右)

void preorder( bitree t ){
    if ( t == null ) return;
    cout<< t->data <<" ";
    preorder ( t->lchild );
    preorder ( t->rchild );
}

2)中序遍历 (左 根 右)

3)后序遍历 (右 左 根)

4)层次遍历

复制代码
void level (bitree t){
    queue q;
    bitree p;

    while(!q.empty()){
        p=q.pop();
        if(p!=null){
            cout<<p->data<<" ";
            q.push(p->lchild);
            q.push(p->rchild);
        }
    }
}
//用队列遍历    
复制代码

6、二叉树的建立

复制代码
void creatbitree(bitree &t){
    cin>>ch;
    if (ch=='#') 
       { t=null;  return;//}
    else 
    {
        t=new bitnode;
        t->data=ch;
        createbitree (t->lchild);
        createbitree (t->rchild);
    }
}
复制代码

 

7、树的存储结构

1)双亲表示法:需要找父节点的

2)孩子表示法

3)孩子兄弟表示法(左孩子右兄弟)

 

8、哈夫曼树(最优树  带权路径长度最短的树)

构造:1)根据n个权值构造n棵二叉树

2)选取最小的权值作为左右子树构成一颗新的二叉树,且置新的二叉树的根节点的权值为左右子树的权值之和

3)删除原来的两棵树,并将新的二叉树加入

4)重复操作直到最后只剩一棵树

 

posted @ 2020-05-31 21:23  陈昱昊  阅读(152)  评论(0编辑  收藏  举报