本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。
輸入格式:
第一行給出正整數n(≤30),是樹中結點的個數。隨後兩行,每行給出n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。
輸出格式:
在一行中輸出preorder:以及該樹的先序遍歷結果。數字間有1個空格,行末不得有多餘空格。
輸入樣例:
72 3 1 5 7 6 4
1 2 3 4 5 6 7
輸出樣例:
preorder: 4 1 3 2 6 5 7
#include
#include
using
namespace std;
typedef
struct nodebitnode,
*bitree;
const
int n =
1e5+10;
int in[n]
,post[n]
,n;/*
因為當同時知道 先序結果 + 中序結果 或者 後序結果 + 中序結果 就可以唯一確定一顆二叉樹,所以可以利用所給出的資料進行二叉樹的重建
首先要知道的是後序遍歷和中序遍歷的特點
後序:左子樹 右子樹 根節點
中序:左子樹 根節點 右子樹
tips: 同一棵樹它的各種遍歷順序出來的結果的長度都是一樣的
模擬一下建樹的過程:
後序:2 3 1 5 7 6 4
中序:1 2 3 4 5 6 7
由最初始的後序可知這棵樹的根節點是 4 同時,由中序遍歷可知 根節點 的左子樹為 1 2 3 (長度為 3) 構成的集合 右子樹為 5 6 7 (長度也為 3) 構成的集合
再看後序遍歷 前面長度為3的集合即為根節點左子樹的後序遍歷的結果,緊跟著的剩下的元素就是根節點右子樹後序遍歷的結果,可知左子樹的根節點為1,右子
樹的根節點為 6 ,再次回到中序遍歷中去,可知 1 無左子樹,所以由 2 和 3 構成的集合是 1 的右子樹,而 6 的左子樹為 5,右子樹為 7,回到後序中去看,
則有 集合 2 3 的根節點為 3 ,其左子樹為 2.
可得出樹為:
41 6
# 3 5 7
2 # # # # #
# #
*/// i 和 j分別為中序和後序陣列中的指標,len表示當前的集合中的元素個數
void
create_tree
(bitree *bt,
int i,
int j,
int len)
int temp = i;
// 暫時記錄中序陣列中指標的初始值
while
(in[temp]
!= post[j + len -1]
)// post[j + len - 1]表示當前的根節點(元素集合中最後乙個被遍歷的點)
(*bt)
=new bitnode;
(*bt)
->data = post[j + len -1]
;// 放入當前的根節點
int dist = temp - i;
// 獲得新的集合長度
create_tree(&
((*bt)
->lchild)
,i,j,dist)
;// 繼續建立左子樹 dist 是左子樹的元素集合中元素的個數
create_tree(&
((*bt)
->rchild)
,temp +
1,j + dist,len - dist -1)
;// 繼續建立右子樹 (len - dist - 1)是右子樹的元素集合中元素的個數
}void
pre(bitree bt)
}int
main
(void
)
7 1 根據後序和中序遍歷輸出先序遍歷(25 分)
題目鏈結 本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。第一行給出正整數 n 是樹中結點的個數。隨後兩行,每行給出 n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。在一行中輸出preorder 以及該樹的先序遍歷結果。數字間...
7 7 根據後序和中序遍歷輸出先序遍歷 25分
本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。輸入格式 第一行給出正整數n 30 是樹中結點的個數。隨後兩行,每行給出n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。輸出格式 在一行中輸出preorder 以及該樹的先序遍歷...
7 8 根據後序和中序遍歷輸出先序遍歷 20分
輸入格式 第一行給出正整數n 30 是樹中結點的個數。隨後兩行,每行給出n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。輸出格式 在一行中輸出preorder 以及該樹的先序遍歷結果。數字間有1個空格,行末不得有多餘空格。輸入樣例 7 2 3 1 5 7 ...