1. 程式人生 > 其它 >給出二叉樹前序和後序遍歷,求中序遍歷總數

給出二叉樹前序和後序遍歷,求中序遍歷總數

技術標籤:二叉樹資料結構

題目描述
我們都很熟悉二叉樹的前序、中序、後序遍歷,在資料結構中常提出這樣的問題:已知一棵二叉樹的前序和中序遍歷,求它的後序遍歷,相應的,已知一棵二叉樹的後序遍歷和中序遍歷序列你也能求出它的前序遍歷。然而給定一棵二叉樹的前序和後序遍歷,你卻不能確定其中序遍歷序列,考慮如下圖中的幾棵二叉樹:
在這裡插入圖片描述

所有這些二叉樹都有著相同的前序遍歷和後序遍歷,但中序遍歷卻不相同。

輸入格式
輸A資料共兩行,第一行表示該二叉樹的前序遍歷結果s1,第二行表示該二叉樹的後序遍歷結果s2。

輸出格式
輸出可能的中序遍歷序列的總數,結果不超過長整型數。

輸入 
abc                           
cba
輸出 
4

只有一個兒子的節點才會在知道前序和後序的情況下有不同的中序遍歷,所以將題目轉化成找只有一個兒子的節點個數。
這類節點在前序和後序中出現的規律為:前序中出現AB,後序中出現BA,則A這個節點只有一個兒子。
每個這類節點有兩種中序遍歷(兒子在左子樹或者右子樹),根據乘法原理中序遍歷數為 2^(節點個數) 種。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	string a,b;
	int cnt=0;
	cin>>a>>b;
	for(int i=0;i<a.length(
);i++) { for(int j=1;j<b.length();j++) { if(a[i]==b[j]&&a[i+1]==b[j-1]) { cnt++; } } } cout<<(1<<cnt)<<endl; return 0; }