[UVA 536] Tree Recovery 二叉树&dfs

题目大意:
给俩字符串,precord的顺序(root, left subtree, right subtree),incord的顺序(left subtree, root, right subtree)。
然后求(left subtree, right subtree, root)。

思路:
原本自己想到的是可以每次按头结点分割,因为precord的第一个字符永远是最上结点。
这样以最上结点在incord中的位置前后分割,左边树和右边树的长度和数值都清楚了。
可以分下去得到从上到下从左到右的所有结点。

这里思路都很顺,然后就死了。
因为不晓得怎么把能得到的这些结点转成左右上的顺序。


见到那关键一步对愚蠢的我而言很难想到,左右上就是上右左倒过来啊。
以上右左的顺序dfs,用个stack存得到的输出就可以了。

感觉还没有入二叉树的门。懵懵懂懂但是一次就过了。

/*
uva 536 Tree Recovery dfs by zhuhua
Time limit: 3000ms
AC time: 0ms???
*/
#include <iostream>
#include <stack>
using namespace std;
string precord,incord;
stack <char> ReOut;
void dfs(string a,string b)
{
    if(a=="")return;
    char head=a[0];
    ReOut.push(head);
    int pos=b.find(head,0);
    //cout<<head<<endl;
    string lefta,leftb,righta,rightb;
    righta=a.substr(pos+1,a.length()-pos-1);
    rightb=b.substr(pos+1,b.length()-pos-1);
    //cout<<righta<<" "<<rightb<<endl;
    dfs(righta,rightb);
    lefta=a.substr(1,pos);
    leftb=b.substr(0,pos);
    dfs(lefta,leftb);
}
int main()
{

    while(cin>>precord>>incord)
        //pre:root,left,right
        //in:left,root,right
    {
        dfs(precord,incord);
        while(!ReOut.empty())
        {
            cout<<ReOut.top();
            ReOut.pop();
        }cout<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值