树查找

问题:

有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。

输入:

输入有多组数据。

每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。

输出:

输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。

例如:

5

1 2 3 4 5

7

7

1 2 3 4 5 6 7

2

0

输出:

EMPTY

2 3

分析:

因为是完全二叉树,采用数组不浪费空间,所以采用数组来做

分析图

获取完全二叉树的深度:(知道总节点的个数):

用代码实现,我是这样想的,循环i,从1开始循环,知道每次行的开头下标和结尾下标,看n是否在这个之间,在就退出循环,i就是深度

//获取深度

int f(int n){

    int i=1;

    while(1){

        //2的i-1次方,就是第i层的开头

        int head=f1(i-1);

        //2的i次方-1,就是第i层的结尾

        int rear=f1(i)-1;

        if(n>=head&&n<=rear){

            break;

        }

        i++;

    }

    return i;

}

代码:

#include <iostream>

using namespace std;

int f(int n){//2的n次方

    int sum=1;

    for(int i=0;i<n;i++){

        sum*=2;

    }

    return sum;

}

int main()

{

    //因为是完全二叉树,所以我使用数组来存储更方便一些

    int n;

    while(cin>>n){

        if(n==0){

            break;

        }

        int p[1000];

        for(int i=1;i<=n;i++){

            cin>>p[i];

        }

        int m;

        cin>>m;

        int p1=f(m-1);//2的m-1次方,这是第m行开头第一个元素的下标

        int p2=f(m)-1;//从第一行到第m行一共有多少个元素

        if(p1<=n&&p2<=n){//从p1到p2遍历

            int i;

            for(i=p1;i<p2;i++){

                cout<<p[i]<<" ";

            }

            cout<<p[i]<<endl;

        }else if(p1<=n&&p2>n){//从p1到n遍历

            int i;

            for(i=p1;i<n;i++){

                cout<<p[i]<<" ";

            }

            cout<<p[i]<<endl;

        }else if(p1>n){

            cout<<"EMPTY"<<endl;

        }

    }

    return 0;

}

结果截图:

树查找
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容