题目-P1305 新二叉树

题目描述

输入一串二叉树,用遍历前序打出。

输入输出格式

输入格式:

第一行为二叉树的节点数n。(n \leq 26n26 )

后面n行,每一个字母为节点,后两个字母分别为其左右儿子。

空节点用*表示

输出格式:

前序排列的二叉树

输入输出样例

输入样例#1:  复制
6
abc
bdi
cj*
d**
i**
j**
输出样例#1:  复制
abdicj









解题思路:一开始准备用结构体表示树,内含双向指针,然后遇到了bug,首先是结构体运用不熟,没搞懂指针指向自定义类型的定义方法,然后就有父亲,儿子双向指针的繁琐,最后又在前序输出这个类似于dfs的输出方法没转过来怎么传送指针指向的内容,卒,,参看大佬题解,才明白思路一样代码也会差好多,1,以Int型代替char型,数组的下标一下子就简洁了,然后节点较简单,可以不用指针而直接存储,最后前序输出时也贼方便;

AC.1:(包含错误代码以示衬托)

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct tree
{
    int le,ri,fa;
}T[30];
int n,root;
string c;
void visit(int k)
{
    char ch = k + 96; printf("%c",ch);
    if(T[k].le!=0) visit(T[k].le);
    if(T[k].ri!=0) visit(T[k].ri);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>c;
        if(c[1]!='*')
        {
            T[c[0]-96].le = c[1]-96;
            T[c[1]-96].fa = c[0]-96;
        }
        if(c[2]!='*')
        {
            T[c[0]-96].ri = c[2]-96;
            T[c[2]-96].fa = c[0]-96;
        }
    }
    for(int i=1;i<=26;i++)
        if(T[i].fa==0)
        {
            root=i;
            break;
        }
    visit(root);
    return 0;
}



//#include<iostream>
//#include<cstdio>
//#include<cstring>
//using namespace std;
//struct Tree
//{
//    char x;
//    Tree* lson;
//    Tree* rson;
//};
//Tree tree[1000];
//int main()
//{
//    int t;
//    cin>>t;
//    char s[4],begain;
//    for(int i=1;i<=t;i++)
//    {
//        cin>>s;
//        if()
////        trees[s[0]].x=s[0];
////        if(trees[s[1]].fa!=NULL)//
////            trees[s[1]].fa=&trees[s[0]];
////        if(trees[s[2]].fa!=NULL)
////            trees[s[2]].fa=&trees[s[0]];
////        if(s[1]!='*')
////            trees[s[0]].lson=&trees[s[1]];
////        if(s[2]!='*')
////            trees[s[0]].rson=&trees[s[2]];
////    }
////    for(int i=97;i<=124;i++)
////    {
////        if(trees[i].x!='0')
////        begain=trees[i].x;
////    }
////    dfs(begain);
//    return 0;
//}

猜你喜欢

转载自blog.csdn.net/sodacoco/article/details/79874885