根據後序和中序遍歷輸出先序遍歷
- 2019 年 11 月 8 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/weixin_42449444/article/details/85331082
題目描述:
本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。
輸入格式:
第一行給出正整數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.後序遍歷的遞歸過程為:若二叉樹為空,遍歷結束。否則:①後序遍歷根結點的左子樹;②後序遍歷根結點的右子樹;③訪問根結點。簡單來說後序遍歷就是從右子樹返回時遇到結點就訪問。
AC程式碼:
#include <bits/stdc++.h> using namespace std; void getpre(int *postorder,int *inorder,int n) //其中數組postorder為後序,inorder為中序,n為每次遍曆數目 { if(n>0) { int root = postorder[n-1]; //根結點為後序遍歷的最後一個 int i; for(i = 0; i < n; i++) //在中序遍歷中查找根結點 { if(inorder[i] == root) { break; } } cout << " " << root; getpre(postorder, inorder, i); //對左子樹來查找根結點 getpre(postorder+i, inorder+i+1, n-i-1); //對右子樹來查找根結點 } } int main() { int n; cin >> n; int postorder[n],inorder[n]; //postorder[n]後序 inorder[n]中序 for(int i=0;i<n;i++) { cin >> postorder[i]; //輸入後序 } for(int i=0;i<n;i++) { cin >> inorder[i]; //輸入中序 } cout << "Preorder:"; getpre(postorder,inorder,n); return 0; }