什么是树?一种存储结构;什么是树?一个元素集合;什么是树,一类生活规律;
树的定义:
在树里存储的元素叫做结点,而树就是n(n>=0)个结点的集合;
if(n==0)
cout<<" 空树 ";
else
{
每一颗大树有许多片树叶,但是只有一个根部;同理,在非空树里有且仅有一个结点叫做根节点;它是非空树最开始的结点,其它结点都是接在它后面;
n>1时:
一颗树中可以有许多棵子树:结点通过顺序关系连接起来,而这些结点的小集合也可以叫做子树;
现实里一棵树的两个分支不可能长着长着又连在一起了,在数据结构里的树也一样,两个子树的之间是没有交际的,它们之间的任意结点不存在连线;
}
树的基本名词:
1.度
结点的度:该结点拥有的子树的个数叫做结点的度;
树的度:树所拥有的结点的度最大值;
2.叶子与枝干
度为0的结点为叶子结点(终端结点);
度不为0的结点为分支结点(非终端结点);
3.结点分类
孩子结点:某结点的子树的根节点为该结点的孩子结点;
双亲结点:孩子结点的上级;
兄弟结点:具有同一个双亲的孩子结点为兄弟结点;
4.树的属性:
路径:从某结点到目标结点走的路(唯一);
路径长度:路径上经过的边数;
5.家族关系
祖先:某路径的头结点称为尾结点的祖先;
子孙:某子树,除了根节点的结点都是根节点的子孙;
6.结点的属性
结点的层数
树的深度:结点层数的最大值;
树的宽度:各层结点个数的最大值;
Accepted_code:
#include<iostream>
using namespace std;
int cs(int i){ // 某结点的层数
int num=0;
int d=1;
while(d<=i) // i只要大于每层的第一个树就满足
{
++num;
d=d*2;
}
return num;
}
int pf(int t){ // 每层的最右边的结点 t层的结点数
int r=0;
for(int i=1;i<=t;++i)
r=r*2+1;
return r;
}
int zuo(int t){ //第t层的结点数
int i=1;
for(int r=1;r<t;++r)
i*=2;
return i;
}
int you(int a,int b){ // 结点a开始,b层后的最右边结点
for(int i=1;i<=b;++i)
a=2*a+1;
return a;
}
int yyou(int a,int b){ // 结点a开始,b层后的最左边结点
for(int i=1;i<=b;++i)
a=2*a;
return a;
}
int main()
{
int m,n;
while(cin>>m>>n&&(m!=0||n!=0))
{
int number,ln,sn; // 总数 = 子树结点树 + 叶结点数
int dm,dn; // m,n所在层数
dm = cs(m);
dn = cs(n);
int l = dn-dm; //层数差
if(l==0) // m结点在最后一层
number=1;
else
{
if(cs(m)==1)
number=n;
else
{
ln = pf(l);
if(n<2*m)
sn=0;
else
{
int wei = you(m,l); // 11的位置
int tou = yyou(m,l); // 11的位置
if(n>wei)
sn=wei-tou+1;
else
sn =n-tou+1;
if(tou>n)
sn=0;
}
number=ln+sn;
}
}
cout<<number<<endl;
}
}