1. 程式人生 > 其它 >cpp每日一題(1)——求先序序列

cpp每日一題(1)——求先序序列

原題目


題目描述
給出一棵二叉樹的中序與後序排列。求出它的先序排列。(約定樹結點用不同的大寫字母表示,長度\(\le 8\)

輸入格式
2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。

輸出格式
1行,表示一棵二叉樹的先序。


解題思路


初步思路

  • 定義node結構體表示樹結點,定義node型別的tree[]陣列來儲存樹;

  • 通過遞迴的方式根據樹的中序和後序序列來確定訪問這棵樹;

  • 最後用再對儲存好的樹訪問其先序序列。

進一步考慮

  • 對於中序序列與後序序列的下標範圍一下子好難找到他們線性的關係,因此全部當作函式引數來傳。

  • 由於本題遞迴的過程就是從樹的根節點向下,先訪問左子樹再訪問右子樹,與先序遍歷的訪問次序相同,因此可以在考慮結點時直接將結點輸出,免去了先儲存樹再先序遍歷的步驟。

簡易版程式碼


#include<bits/stdc++.h>
using namespace std; 
string mid,last;
int len;
void dfs(int ml,int mr,int ll,int lr)//ml,mr定位中序序列,ll,lr定位後序序列 
{
	cout<<last[lr];
	int i;
	for(i=0;i<=len;i++)if(mid[i]==last[lr])break;//從中序序列中找到根結點位置
	if(i>ml)dfs(ml,i-1,ll,lr-mr+i-1);//兩序列下標的範圍是重點
	if(i<mr)dfs(i+1,mr,ll+i-ml,lr-1);//要很仔細地去模擬
}
int main()
{
	cin>>mid;
	cin>>last;
	len=mid.length()-1;
	dfs(0,len,0,len);
	return 0;
}

總結與反思


二叉樹有關的題目多為模擬題,因此需要超級無敵非常細心,並思考能否簡化演算法,這樣才能不掉坑。