zoukankan      html  css  js  c++  java
  • NYOJ 756 重建二叉树 (二叉树)

    题目链接

    描述

    题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。

    • 输入
      输入有多组数据(少于100组),以文件结尾结束。每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。
    • 输出
      每组输出数据单独占一行,输出对应得先序序列。
    • 样例输入
      ACBFGED ABCDEFG
      CDAB CBAD
    • 样例输出
      DBACEGF
      BCAD

    分析:

    与树的遍历这道题基本上可以说是一毛一样了,唯一的不同就是这道题是已知一棵二叉树的后序和中序序列,让输出该棵二叉树的先序序列;而树的遍历那道题是已知一颗二叉树的先序和中序序列,要求输出该棵二叉树的后序序列。换汤不换药,代码只需略加改动。

    代码:

    #include<string>
    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    using namespace std;
    struct Node
    {
       char data;
       Node * lchild;
       Node * rchild;
    };
    
    Node *build(string hou,string in)
    {
        Node * root=NULL;
        if(hou.length()>0)
        {
            int k=hou.length();
            root=new Node;
            root->data=hou[k-1];
            int index=in.find(hou[k-1]);///在中序序列中找到当前树的根节点
            root->lchild=build(hou.substr(0,index),in.substr(0,index));///递归左子树
            root->rchild=build(hou.substr(index,k-1-index),in.substr(index+1));///递归右子树
        }
        return root;
    }
    
    void post(Node *root)
    {
        if(root!=NULL)
        {
            printf("%c",root->data);///先输出根节点
            post(root->lchild);///再访问左子树
            post(root->rchild);///最后访问右子树
    
        }
    }
    int main()
    {
        string hou,in;
        while(cin>>hou>>in)
        {
            Node* root=build(hou,in);///将后序和中序序列转换为先序序列
            post(root);///先序序列递归输出
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    [Java]java内存及数据区
    [ASP.NET]ASP.NET中常用的26个优化性能方法
    [Oracle]Oracle数据库CPU利用率很高解决方案
    [JAVA]java复制文件的4种方式
    [Oracle]Oracle部分函数
    [Oracle]Oracle良性SQL建议
    序列化与反序列化
    Python用@property使类方法像属性一样访问
    笔记(assert 断言)
    Python使用__slots__限制实例属性
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6740834.html
Copyright © 2011-2022 走看看