數據結構 二叉樹 根據后序和中序遍歷輸出先序遍歷


根據后序和中序遍歷輸出先序遍歷 

題目描述:

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

輸入格式:

第一行給出正整數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

相關知識:

1.先序遍歷的遞歸過程為:若二叉樹為空,遍歷結束。否則:①訪問根結點;②先序遍歷根結點的左子樹;③先序遍歷根結點的右子樹。 簡單來說先序遍歷就是在深入時遇到結點就訪問。

2.中序遍歷的遞歸過程為:若二叉樹為空,遍歷結束。否則:①中序遍歷根結點的左子樹;②訪問根結點;③中序遍歷根結點的右子樹。簡單來說中序遍歷就是從左子樹返回時遇到結點就訪問。

3.后序遍歷的遞歸過程為:若二叉樹為空,遍歷結束。否則:①后序遍歷根結點的左子樹;②后序遍歷根結點的右子樹;③訪問根結點。簡單來說后序遍歷就是從右子樹返回時遇到結點就訪問。

我的代碼:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 void getpre(int *a,int *b,int n)    //其中數組a為后序,b為中序,n為每次遍歷數目,用來求c這個先序
 5 {
 6     if(n>0)  
 7     { 
 8         int root = a[n-1];  //根結點為后序遍歷的最后一個
 9         int i;
10         for(i=0;i<n;i++)    //在中序遍歷中查找根結點
11         {
12             if(b[i] == root) 
13             {
14                 break;
15             }
16         }
17         cout << " " << root;
18         getpre(a, b, i);    //對左子樹來查找根結點
19         getpre(a+i, b+i+1, n-i-1);  //對右子樹來查找根結點
20     }
21 }
22 
23 int main()
24 {
25     int n;
26     cin >> n;
27     int a[n],b[n],c[n];  //a[n]后序 b[n]中序
28     for(int i=0;i<n;i++)
29     {
30         cin >> a[i];    //輸入后序
31     }
32     for(int i=0;i<n;i++)
33     {
34         cin >> b[i];    //輸入中序
35     }
36     cout << "Preorder:";
37     getpre(a,b,n);
38     return 0;
39 }

 

 


免責聲明!

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



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