遍歷情況:
前序:根結點 ---> 左子樹 ---> 右子樹
中序:左子樹---> 根結點 ---> 右子樹
後序:左子樹 ---> 右子樹 ---> 根結點
例題一:
輸入描述 input description
輸入檔案共2行,第一行表示該樹的前序遍歷結果,第二行表示該樹的後序遍歷結果。輸入的字符集合為,長度不超過26。
輸出描述 output description
輸出檔案只包含乙個不超過長整型的整數,表示可能的中序遍歷序列的總數。
樣例輸入 sample input
abccba
樣例輸出 sample output
思路:由以上的前中後遍歷順序可以看出在已知前序遍歷和後序遍歷的情況下,中序遍歷不是唯一確定的。而且中序遍歷的不確定性是由乙個節點(只有一邊子樹)的左右子樹的不確定性決定的。例如前序遍歷ab,後序遍歷ba,a為根,b為子樹,在中序遍歷中如果b為左子樹,則中序遍歷為ba;如果b為右子樹,則中序遍歷為ab。所以當這種節點有n個時,中序遍歷的可能性就有:2^n;
那麼問題就轉變為如果確定這種節點的數量。可以總結出乙個規律,如上例。前序遍歷為ab,後序遍歷為ba,此時無法確定b是為左子樹還是右子樹,那麼就產生了乙個特殊節點。所以規律就是(此時a,b分別為前序遍歷和後序遍歷的字串):a[i]==b[j]時,a[i+1]==b[j-1]則產生乙個特殊節點
**:
#include#include#include
#include
using
namespace
std;
intmain()}}
cout
<2,cnt)
}
例題二:
輸入:第一行輸入二叉樹的結點數n
第二行輸入前序遍歷的結點編號序列,相鄰編號用空格隔開
第3行輸入中序遍歷的結點編號序列,相鄰編號用空格隔開
結點編號為從1至n的整數,請注意,1不一定是根節點
輸出:在1行中輸出按後序遍歷時的結點編號序列。相鄰結點編號之間用1個空格隔開。
限制:1<=結點數<=100
輸入示例:
1 2 3 4 5
3 2 4 1 5
輸出示例:
3 4 2 5 1
**:
#include#include#include
#include
using
namespace
std;
vector
pre,in
,post;
intn,pos;
void rec(int l,int
r)void
solve()
cout
<}int
main()
for(int i=0;i)
solve();
return0;
}
前序中序求後序 後序中序求前序層次 模板
這是資料結構的知識。剛開始先拒絕用指標去寫。當我把這個想法和別人分享是,別人說不喜歡用指標的程式設計師不是乙個好的c c 程式設計師。所以,就有了這麼勵志的時刻,我參考大牛的 自己用指標寫了個遍,直接1a 不用指標總是出現各種想不到的錯誤。心累。orz.include include include...
前序中序求後序
test fdxeag xdefag 涉及到二叉樹的問題最好不用動態申請,對記憶體的管理很麻煩 採用預分配的靜態陣列 本題目由前序和中序得到後序,方法 先構造二叉樹,再進行 include includestruct nodetree 50 char str1 50 str2 50 分別存放前序和中...
前序 中序 後序遍歷
先序遍歷也叫做 先根遍歷 前序遍歷,可記做根左右 二叉樹父結點向下先左後右 首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹,如果二叉樹為空則返回。例如,下圖所示二叉樹的遍歷結果是 abdecf 中序遍歷首先遍歷左子樹,然後訪問根結點...