栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

洛谷【p1305】新二叉树(c++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

洛谷【p1305】新二叉树(c++)

https://www.luogu.com.cn/problem/P1305

题目描述
输入一串二叉树,输出其前序遍历。

输入格式
第一行为二叉树的节点数 n。(1≤n≤26)
后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用 * 表示

输出格式
二叉树的前序遍历。

输入输出样例
输入 #1

6
abc
bdi
cj*
d**
i**
j**

输出 #1

abdicj

解释:
这题一开始我是想建立一棵树的 然后在利用前序遍历,但是我太辣鸡 了,实在想不到其他的方法了,没办法,就只能用 这个了 就根据题目的意思 建立一课树。

  • 先单独输入第一行,本来可以放在循环里的,但是要传入一个头节点, 就得先输入
  • 先输入一个头节点,然后就连接它的左孩子和右孩子
  • 然后在从2循环到n, 输入下个节点和左孩子和右孩子
  • 最后就把头节点传过去,进行前序遍历, 边界条件就是碰到 ’ * ‘ 就退出

下面附上我的代码:

// 其实我是真的不想用结构体的, 不过没办法, 唉

#include
using namespace std;
char h, h1;
struct treeNode {
    char left;
    char right;
}tree[30];

void pre(char x) {  // 前序遍历
    if (x == '*')
        return ;
    cout << x;
    pre(tree[x].left);
    pre(tree[x].right);
}

int main()
{
    int n;
    cin >> n;
    cin >> h;  // 本来 这个也可以写在下面的循环里的, 但是要保存第一个节点就不能写在下面的循环里了
    cin >> tree[h].left;
    cin >> tree[h].right;
    for (int i = 2; i <= n; i ++) {  // 建立二叉树
        cin >> h1;
        cin >> tree[h1].left;
        cin >> tree[h1].right;
    }
    pre(h);
    return 0;
}

哈哈哈 其实是骗你们的啦 我还有一种方法哦, 不过这个也是看了其他大佬的思路才想到的
这个就不详细写过程了, 你们自己看看吧, 应该是可以看懂的 思想不难

#include
#include
using namespace std;
string s, ss;
int n;
int main()
{
    cin >> n;
    cin >> s;
    for (int i = 2; i <= n; i ++) {
        cin >> ss;
        int idx = s.find(ss[0]);  // 找出 这个节点在原节点的哪个地方
        s.erase(idx, 1);  // 只能到1, 因为到2的话就是 右孩子了 
        s.insert(idx, ss);  // 在原来的那个地方插入 这个新输入的一些节点
    }
    for (int i = 0; i < s.size(); i ++)
        if (s[i] != '*')
            cout << s[i];
    return 0;
}

以上仅供参考(防抄袭哦 )嘻嘻來

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923724.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号