简单树

跟風遠走 提交于 2019-12-02 14:30:25

什么是树?一种存储结构;什么是树?一个元素集合;什么是树,一类生活规律;

树的定义
在树里存储的元素叫做结点,而树就是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;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!