数据结构-核心算法

树的性质

在这里插入图片描述
在这里插入图片描述











在这里插入图片描述









在这里插入图片描述

证明
第i层上最多的结点数为mi-1(i=1~h)
显然当高度为h的m次树为满m次树时结点个数最多,因此有以下关系。

最多结点数=每一层最多结点数之和=m0+m1+m2+…+mh-1= m h − 1 m − 1 \frac{m^h-1}{m-1} m1mh1










在这里插入图片描述

证明
设具有n个结点的m次树的最小高度为h,若在该树中前h-1层都是满的,即每一层的结点树都等于mi-1(1≤i≤h-1)个,第h层(即最后一层)的结点树可能满,也可能不满,但至少有一个结点,则该树具有最小的高度。

在这里插入图片描述











⭐线性结构和树形结构的比较

在这里插入图片描述

在这里插入图片描述










⭐⭐二叉树先序、中序、后序遍历递归算法

void PreOrder(BiTree bt)
{
//先序遍历
    if(bt!=NULL)
    {
        printf("%c",bt->data);
        PreOrder(bt->lchild);
        PreOrder(bt->rchild);
    }
}

void InOrder(BiTree bt)
{
//中序遍历
    if(bt!=NULL)
    {
        InOrder(bt->lchild);
        printf("%c",bt->data);
        InOrder(bt->rchild);
    }

}

void PostOrder(BiTree bt)
{
//后序遍历
    if(bt!=NULL)
    {
        PostOrder(bt->lchild);
        PostOrder(bt->rchild);
        printf("%c",bt->data);
    }

}











⭐⭐⭐⭐⭐二叉树的深度

求二叉树b的高度的递归模型f(b)如下:

f(b) = 0		//若b=NULL
f(b) = MAX { f(b->lchild),f(b->rchild)}+1 //其他情况

递归算法如下:

int BTHeight(BiTree bt)
{
    int lchild,rchild;
    if(bt==NULL)
        return 0;
    else{
        lchild=BTHeight(bt->lchild);
        rchild=BTHeight(bt->rchild);
        return (lchild>rchild)?(lchild+1):(rchild+1);
    }
}











⭐⭐孩子兄弟链存储结构

以孩子兄弟链作为树的存储结构设计一个求树t的高度的递归算法

typedef struct tnode
{
    char data; //节点的值
    struct tnode *hp; //指向兄弟
    struct tnode *vp; //指向孩子节点
} TSBNode; //孩子兄弟链存储结构类型
int TreeHeight2(TSBNode *t)
{
    TSBNode *p;
    int h, maxh = 0;
    if (t == NULL)
    {
        return 0; //空树返回0
    }
    else
    {
        cout << "t = " << t->data << endl;
        p = t->vp; //指向第1个孩子节点
        while (p != NULL) //扫描t的所有子树
        {
            h = TreeHeight2(p); //求出p子树的高度
            cout << "h = " << h << endl;
            if (maxh < h)
                maxh = h; //求所有子树的最大高度
            p = p->hp; //继续处理t的其他子树
        }
        return (maxh + 1); //返回maxh+1
    }
}











孩子链存储结构

以孩子链表作为树的存储结构,设计一个求树t的高度的递归算法

int	TreeHeight1(TSonNode *t)
{
	TSonNode *p;
	int i,h,maxh=0;
	if(t==NULL)
		return 0;//空树返回高度0
	else{
		for(i=0;i<MaxSons;i++)
		{
			p=t->sons[i];	//p指向t的第i+1个孩子结点
			if(p!=NULL)//若存在第i+1个孩子
			{
				h=TreeHeight1(p);//求出对应子树的高度
				if(p!=NULL)
				{
					if(maxh<h)
						maxh=h;//求出所有子树的最大高度
				}
			}
		}
		return (maxh+1); //返回maxh+1
	}	
}











二叉树的性质

在这里插入图片描述
在这里插入图片描述

完全二叉树的性质

在这里插入图片描述
在这里插入图片描述
性质5:在这里插入图片描述











二叉树的顺序存储和链式存储的优缺点

在这里插入图片描述










⭐⭐根据前序和中序(中序和后序)画出二叉树

在这里插入图片描述










⭐⭐哈夫曼的构造

举例:    已知某系统在通讯联络中只可能出现八种字符A,B,C,D,E,F,G,H, 其概率分别为:0.05, 0.29, 0.07, 0.08, 0.14, 0.23,0.03,0.11试设计哈夫曼编码.
在这里插入图片描述





在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值