已知一棵二叉樹的前序序列和中序序列分別存於兩個一維陣列中,試編寫演算法建立該二叉樹的二叉鍊錶。
分兩行分別輸入一棵二叉樹的前序序列和中序序列。
輸出該二叉樹的後序序列。
知識點回顧:二叉樹
1、二叉樹的定義
二叉樹是n(n≥0)個節點的有限集合,它或者是空樹(n=0),或者是有乙個根節點及兩顆不相交的且分別稱為左、右子樹的二叉樹所組成。可見,二叉樹同樣具有遞迴性質。
特別需要注意的是,儘管樹和二叉樹的概念之間有許多聯絡,但它們是兩個不同的概念,樹和二叉樹之間最主要的區別是:二叉樹結點的子樹要區分左子樹和右子樹,即使在節點只有乙個子樹的情況下,也要明確指出該子樹是左子樹還是右子樹。另外,二叉樹結點最大度為2,二樹中不限制節點的度數。
2、二叉樹的性質
(1)二叉樹第i層(i≥1)上至多有個節點
(2)高度為k的二叉樹之多有個節點(k≥1)
(3)對於任一顆二叉樹,若其終端的節點數為,度為2的節點數為,則
(4)具有n個節點的完全二叉樹的深度為
3、二叉樹的儲存結構
1)二叉樹的順序儲存結構
用一組位址連續的儲存單元儲存二叉樹中的節點,必須把節點排成乙個適當的線性序列,並且節點在這個序列中的相互位置能反映出節點之間的邏輯關係。
2)二叉樹的鏈式儲存結構
由於二叉樹的節點中包含有資料元素、左子樹的根、右子樹的根及雙親等資訊,因此可以用三叉鍊錶或二叉鍊錶(即乙個節點含有三個指標或兩個指標)來儲存二叉樹,鍊錶的頭指標指向二叉樹的根節點。
4、二叉樹的遍歷
遍歷二叉樹的方法分別有先序遍歷、中序遍歷、後序遍歷。
先序遍歷:先遍歷根節點,然後是左子樹,最後是右子樹;根節點->左子樹->右子樹
中序遍歷:先遍歷左子樹,然後是根節點、最後是右子樹;左子樹->根節點->右子樹
後序遍歷:先遍歷左子樹,然後是右子樹,最後是根節點;左子樹->右子樹->根節點
下面給出一種已知二叉樹前中序,求其二叉鍊錶的演算法,遞迴~
前:abdfgceh
中:bfdgaceh
後:fgdbheca
// luogu-judger-enable-o2
#include#include#define rg register ll
#define inf 2147483647
#define min(a,b) (ab?a:b)
#define ll long long
#define maxn 1000005
#define lb(x) (x&(-x))
const double eps = 1e-6;
using namespace std;
inline ll read()
while (ch >= 48 && ch <= 57)
return s * w;
}inline void write(ll x)
typedef struct node
binode,*bitree;
inline void print(bitree t)
else return ;
}char pre[maxn],mid[maxn];
inline binode* work(ll pre_b,ll pre_e,ll mid_b,ll mid_e)
int main()
嚴蔚敏資料結構習題3 17
3.17 試寫乙個演算法,識別一次讀入的乙個以 為結束符的字串行是否為形如 序列1 序列2 模式的字串行。其中序列1和序列2中都不含字元 且序列2是序列1的逆序列。例如,a b b a 是屬該模式的字串行,而 1 3 3 1 則不是。include include define stack init...
嚴蔚敏資料結構習題3 31
3.31 假設稱正讀和反讀都相同的字串行為 回文 例如,abba 和 abcba 是回文,abcde 和 ababab 則不是回文。試寫乙個演算法判別讀入的乙個以 為結束符的字串行是否是 回文 這題非常簡單,分別入棧和入隊,然後出棧和出佇列比較,相同即可。這種思路我也是靈光一閃想到的。本以為能沾沾自...
嚴蔚敏 資料結構習題 6 52
乙個二叉樹的繁茂度定義為各層節點數的最大值與樹的高度的乘積。是寫個演算法,求二叉樹的繁茂度。其實就是找出結點數最多的那一層,然後結點數乘以樹的高度 include include include include include include include include using namesp...