P1305 新二叉树 【寻找根节点进行先序遍历】

题目

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

 

 思路

本题的注意事项就是首先要确定输入的根节点,我们可以发现就是从来没有在左子树以及右子树出现的节点就是根节点,所以我们先用map标记所有出现的节点,再记录下来所有子树对应的父亲节点,这样即在map中标记过又没有父亲节点的就是根节点

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<map>
using namespace std;
struct node
{
    char data;
    char left;
    char right;
    char father;
}list[200];
map<char, int>cc;
void run(int root)
{

    printf("%c", list[root].data);
    if (list[root].left != '*')    run(list[root].left - 96);
    if (list[root].right != '*')run(list[root].right- 96);
}

int main()
{
    int n;
    cin >> n;
    getchar();
    for (int i = 0; i < n; i++)
    {
        char a, b, c;
        cin >> a >> b >> c;
        list[a-96].data = a;
        cc[a] = 1;
    
            list[a-96].left = b;
            if(b!='*')
            list[b-96].father = a;
        
        
            list[a-96].right = c;
            if(c!='*')
            list[c-96].father = a;
        
    }
    int root = 0;
    for (int i = 0; i < 200; i++)
    {
        if (list[i].father == '\0'&&cc[list[i].data]==1) { root = i; break; }
    }
    run(root);


}

 

posted @ 2020-06-28 09:25  Jason66661010  阅读(273)  评论(0编辑  收藏  举报