練習4.1 根據后序和中序遍歷輸出先序遍歷(25 分)浙大版《數據結構(第2版)》題目集


本題要求根據給定的一棵二叉樹的后序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。

輸入格式:

第一行給出正整數N(30),是樹中結點的個數。隨后兩行,每行給出N個整數,分別對應后序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。

輸出格式:

在一行中輸出Preorder:以及該樹的先序遍歷結果。數字間有1個空格,行末不得有多余空格。

輸入樣例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

輸出樣例:

Preorder: 4 1 3 2 6 5 7


代碼:
#include <iostream>
#include <map>
#include <algorithm>
#include <stack>

using namespace std;
int h[30],z[30];
struct Tree
{
    Tree *l,*r;
    int data;
};
Tree *CreatNode()
{
    Tree *p = new Tree();
    p -> l = NULL;
    p -> r = NULL;
    return p;
}
Tree *RestoreTree(int h1,int h2,int z1,int z2)
{
    Tree *head = CreatNode();
    head -> data = h[h2];
    for(int i = z1;i <= z2;i ++)
    {
        if(z[i] == h[h2])
        {
            if(i != z1)head -> l = RestoreTree(h1,h1 + i - z1 - 1,z1,i - 1);
            if(i != z2)head -> r = RestoreTree(h2 - z2 + i,h2 - 1,i + 1,z2);
            break;
        }
    }
    return head;
}
void preOrder(Tree *tree)
{
    cout<<' '<<tree -> data;
    if(tree -> l != NULL)preOrder(tree -> l);
    if(tree -> r != NULL)preOrder(tree -> r);
}
int main()
{
    int n;
    cin>>n;
    for(int i = 0;i < n;i ++)
    {
        cin>>h[i];
    }
    for(int i = 0;i < n;i ++)
    {
        cin>>z[i];
    }
    Tree *head = RestoreTree(0,n-1,0,n-1);
    cout<<"Preorder:";
    preOrder(head);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM