标题:给定数组按要求生成树
只看楼主
qiansu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2021-6-22
结帖率:50%
已结贴  问题点数:20 回复次数:5 
给定数组按要求生成树
问题是这样的 假设给你一个非负整数且不重复的序列 如{1,2,3,4}
生成的树    根节点自己设置 值为-1  那么它有4个子结点 分别为1 2 3 4
我们将4个结点称为父序列
在每个结点中都要生成 父序列中不包含父结点 的子结点 如果父序列除去父结点外没有元素 就不生成
例如 结点1生成的子结点为2 3 4
每个子结点都要继续产生子结点 直到无法生产。
生成树的图样在这个网址 论坛好像不能上传图片
http://qiansu.top/png/Tree.png
搜索更多相关主题的帖子: 结点 序列 生成 生成树 子结点 
2021-06-22 15:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
怎么好多人连问题都描述不清?

假如输入 { 0, 1 }
按照你的文字描述,应该输出 { -1: { 0:{1}, 1:{0} } }
但参考你给出的图片,却应该输出 { -1: { 0:{1}, 1:{} } }

假如以你的“图”为标准,那么你要交代清楚以什么规则取舍?
比如输入 { 1, 0 },那你想要输出 { -1: { 1:{0}, 0:{} } },还是 { -1: { 0:{1}, 1:{} } } ?
2021-06-23 09:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
需求描述不清,那我就连蒙带猜写一个

程序代码:
#include <iostream>
#include <string>
#include <span>
using namespace std;

std::string foo( const std::span<int> buf, const std::string& prefix="" )
{
    if( buf.empty() )
        return {};

    std::string result = std::to_string(buf[0]) + '\n';
    for( size_t i=1; i!=buf.size(); ++i )
        result += prefix + (i+1!=buf.size()?"├─":"└─") + foo( buf.subspan(i), prefix+"│ " );
    return result;
}

int main( void )
{
    int a[] = { -1, 1, 2, 3, 4 };
    cout << foo(a) << endl;

    int b[] = { -1, 1, 0 };
    cout << foo(b) << endl;
}


输出
-1
├─1
│ ├─2
│ │ ├─3
│ │ │ └─4
│ │ └─4
│ ├─3
│ │ └─4
│ └─4
├─2
│ ├─3
│ │ └─4
│ └─4
├─3
│ └─4
└─4

-1
├─1
│ └─0
└─0
2021-06-23 10:29
qiansu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2021-6-22
得分:0 
回复 3楼 rjsp
是的 就是这样 谢谢
2021-06-24 19:22
qiansu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2021-6-22
得分:0 
回复 3楼 rjsp
但是我不能用C++20 的标准 这个span头文件用不了
能否换一个方式
2021-06-24 19:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 5楼 qiansu
那你自己改一下嘛

程序代码:
#include <iostream>
#include <string>
using namespace std;

std::string foo( const int buf[], size_t bufsize, const std::string& prefix="" )
{
    if( bufsize == 0 )
        return {};

    std::string result = std::to_string(buf[0]) + '\n';
    for( size_t i=1; i!=bufsize; ++i )
        result += prefix + (i+1!=bufsize?"├─":"└─") + foo( buf+i, bufsize-i, prefix+"│ " );
    return result;
}

int main( void )
{
    int a[] = { -1, 1, 2, 3, 4 };
    cout << foo(a,std::size(a)) << endl;

    int b[] = { -1, 1, 0 };
    cout << foo(b,std::size(b)) << endl;
}
2021-06-25 08:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506055-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.128256 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved