第五章小结
第五章学习了数和二叉树
1.二叉树的性质
1)在二叉树的第i层上至多有2i-1个结点。
2)深度为k的二叉树上至多含2k - 1个结点(k≥1)。
3)对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必存在关系式:n0 = n2 + 1。(n=n0+n1+n2,n=n1+2n2+1)
4)具有n个结点的完全二叉树的深度为 (log2n) +1 。
5)对完全二叉树,若从上至下、从左至右编号,则编号为 i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2。
2.森林与二叉树的互相转换
3.树的存储结构
1)双亲表示法
结构:data+parent
2)双亲孩子表示法
结构:data+parent+*firstchild
3)孩子兄弟表示法(适用于将树转换为双叉树并处理)
结构:data+*firstchild+*nextsibling
4.哈夫曼树的构造和WPL算法
在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。在森林中删除这两棵树,同时将新得到的二叉树加入森林中。重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。
List Leaves
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
typedef struct
{
int lchild;
int rchild;
}Node;
typedef struct
{
Node date[10];
int root;
}Bitree;
void create (Bitree &T)
{//读入数据并找出根节点
int n;
char a,b;
cin>>n;
bool check[10]={false};//技巧:寻找根节点数组
for(int i=0;i<n;i++)
{
cin>>a>>b;
if(a=='-')
T.date[i].lchild=-1;
else
{
T.date[i].lchild=a-'0';//整型转变
check[a-'0']=true;
}
if(b=='-')
T.date[i].rchild=-1;
else
{
T.date[i].rchild=b-'0';//整型转变
check[b-'0']=true;
}
}
for(int i=0;i<n;i++)
{
if(check[i]==false)
{
T.root=i;
//cout<<i<<endl;
break;
}
}
}
void order(Bitree T)
{//先进先出,队列
queue<int> Q;
Q.push(T.root);
int k;
bool flag=false;
//int flag=0;
while(!Q.empty())
{
k=Q.front();//获取队列头结点
Q.pop();
if(T.date[k].lchild==-1&&T.date[k].rchild==-1)
{
if(flag==false)
//if(flag==0)
{
cout<<k;
flag=true;
}
else
cout<<" "<<k;
}
else
{
if(T.date[k].lchild!=-1)
Q.push(T.date[k].lchild);
if(T.date[k].rchild!=-1)
Q.push(T.date[k].rchild);
}
}
树的同构
bool Campare(int root1, int root2)
{
//都是空树
if (root1==-1&&root2==-1)
return true;
//一个空树一个不空
if ((root1==-1&&root2!=-1)||(root1!=-1&&root2==-1))
return false;
//根节点都存在但数值不同
if (T1[root1].date!=T2[root2].date)
return false;
//左子树都存在且值相等,判断右子树
if (T1[root1].lch!=-1&&T2[root2].lch!=-1&&T1[T1[root1].lch].date==T2[T2[root2].lch].date)
return Campare(T1[root1].rch,T2[root2].rch);
else//子树互换比较
return(Campare(T1[root1].rch,T2[root2].lch)&&Campare(T1[root1].lch,T2[root2].rch));
}
求二叉树的叶子结点个数
int caculateleaves(Bitree S /*,int num*/)
{
if(S==NULL)
return 0;
if(S->lchild==NULL&&S->rchild==NULL)
return 1;
return caculateleaves(S->lchild)+caculateleaves(S->rchild);
}
浙公网安备 33010602011771号