資料結構嚴書習題6 65已知前中序,求二叉鍊錶

2021-09-29 03:54:19 字數 1933 閱讀 2814

已知一棵二叉樹的前序序列和中序序列分別存於兩個一維陣列中,試編寫演算法建立該二叉樹的二叉鍊錶。

分兩行分別輸入一棵二叉樹的前序序列和中序序列。

輸出該二叉樹的後序序列。

知識點回顧:二叉樹

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...