重構二叉樹 輸出 (層序遍歷 其他遍歷)

2022-09-19 11:27:11 字數 4184 閱讀 6867

一、題型

輸入是兩個一維陣列,分別表示樹的前/中/後序遍歷和前/中/後序遍歷結果,輸出是輸出二叉樹或層序遍歷或其他。

二、分類

1. 輸入:前序+中序   輸出

2. 輸入:前序+後序   輸出

3. 輸入:中序+後序   輸出

三、重構二叉樹

1. 重構二叉樹思路:前序遍歷的第乙個節點即為根節點,在前序遍歷中找到根節點後,再在中序遍歷中找到根節點的位置,根節點的左邊所有點就是它的左子樹,右邊所有節點就是它的右子樹。統計左子樹有幾個點,然後在前序遍歷陣列中根節點的後面找幾個點,右子樹也一樣。然後再在左子樹和右子樹中尋找下乙個根節點,重複上面操作。結合下面例子來理解一下。

2.舉例(前序 + 中序)

給出前序遍歷陣列:前序: a b d e h i c f k g

給出中序遍歷陣列:中序: d b h e i a f k c g

首先前序遍歷的第乙個節點a就是根節點,在中序遍歷中找到a的位置,下標為5,則a的左邊5個節點即為左子樹,右邊4個節點即為右子樹。

先遞迴a的左子樹,a的左子樹有5個,則在前序遍歷a的後面5個範圍內找,第乙個點是b,則b是左子樹的第乙個根節點,又在中序中找到b的位置,為1,

b的左邊只有d,則d是b的左節點,b的右邊有三個,則遞迴b的右子樹。b的右邊有3個,則在前序遍歷中找e h i 三個點,e先,則e是b的右節點。繼續重複。。。。

如下圖中的操作。

3. 重構二叉樹的**框架

前序 + 中序:

#include using

namespace

std;

int pre[31],in[31

];typedef

struct

binarytreebinarytree,*tree;

//注:另外命名乙個*tree,後面佇列那裡要用到

//找到後序遍歷的根節點在中序遍歷的位置,記為r

int findrootininoder(int begin,int end,int

key)}/*

* 重構二叉樹:前序+中序**/

binarytree *getbinarytree(int pbegin,int pend,int ibegin,int

iend)

binarytree *root = new

struct binarytree;//

新建一顆樹

*root = ; //前

序遍歷的第乙個值即為根節點。注意:root前要有*否則報錯

int r =findrootininoder(ibegin,iend,pre[pbegin]);

//遞迴求左子樹、右子樹

int count=r-ibegin; //

左子樹節點的個數,有幾個就在前序遍歷中從pbegin開始找幾個

if(r!=ibegin)

root->left = getbinarytree(pbegin+1, (r-ibegin)+pbegin+1, ibegin, r

);

if(r!=iend)

root->right = getbinarytree((r-ibegin)+pbegin+1, pend, r+1, iend

);

return

root;

}int

main()

中序 + 後序:

思路、**框架都一樣,只不過需要改掉下面①②③④個部分

#include using

namespace

std;

int post[31],in[31

];typedef

struct

binarytreebinarytree,*tree;

//注:另外命名乙個*tree,後面佇列那裡要用到

//找到後序遍歷的根節點在中序遍歷的位置,記為r

int findrootininoder(int begin,int end,int

key)}/*

* 重構二叉樹:後序+中序**/

binarytree *getbinarytree(int pbegin,int pend,int ibegin,int

iend)

binarytree *root = new

struct binarytree;//

新建一顆樹

*root = ; //

後序遍歷的最後乙個值即為根節點。注意:root前要有*否則報錯 ①

int r =findrootininoder(ibegin,iend,post[pend]); ②

//遞迴求左子樹、右子樹

int count=r-ibegin; //

左子樹節點的個數,有幾個就在後序遍歷中從pbegin開始找幾個

if(r!=ibegin)

root->left = getbinarytree(pbegin,pbegin+count-1,ibegin,r-1

); ③

if(r!=iend)

root->right = getbinarytree(pbegin+count,pend-1,r+1

,iend); ④

return

root;

}int

main()

前序 + 後序:也一樣,略。

四、例子

l2-006 樹的遍歷 (25 分)

給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。

輸入第一行給出乙個正整數n(≤30),是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。

在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。

7

2 3 1 5 7 6 4

1 2 3 4 5 6 7

4 1 6 3 5 7 2

#include using

namespace

std;

int post[31],in[31

];typedef

struct

binarytreebinarytree,*tree;

//注:另外命名乙個*tree,後面佇列那裡要用到

//找到後序遍歷的根節點在中序遍歷的位置,記為r

int findrootininoder(int begin,int end,int

key)}/*

* 重構二叉樹:後序+中序**/

binarytree *getbinarytree(int pbegin,int pend,int ibegin,int

iend)

binarytree *root = new

struct binarytree;//

新建一顆樹

*root = ; //

後序遍歷的最後乙個值即為根節點。注意:root前要有*否則報錯

int r =findrootininoder(ibegin,iend,post[pend]);

//遞迴求左子樹、右子樹

int count=r-ibegin; //

左子樹節點的個數,有幾個就在後序遍歷中從pbegin開始找幾個

if(r!=ibegin)

root->left = getbinarytree(pbegin,pbegin+count-1,ibegin,r-1

);

if(r!=iend)

root->right = getbinarytree(pbegin+count,pend-1,r+1

,iend);

return

root;}/*

* 輸出層序遍歷(常用佇列實現)**/

void

sequence(tree root)

}int

main()

寫得有點匆忙,有錯誤歡迎指正。

二叉樹層序遍歷 求二叉樹的層序遍歷

給定乙個二叉樹,返回該二叉樹層序遍歷的結果,從左到右,一層一層地遍歷 例如 給定的二叉樹是,該二叉樹層序遍歷的結果是 3 9,20 15,7 示例1 輸入 返回值 1 2 示例2輸入 返回值 1 2,3 4,5 解題思路 重點是如何把在一層的節點放到一起,設定乙個引數專門放一層的節點 class t...

層序遍歷二叉樹

要求 設計乙個演算法層序遍歷二叉樹 同一層從左到右訪問 我寫了乙個演算法 用乙個佇列儲存被訪問的當前節點的左右孩子以實現層序遍歷。status hierarchybitree bitree t,status visit telemtype e destroyqueue q 釋放佇列空間 return...

二叉樹層序遍歷

主要流程 確定root非空 根指標進佇列 佇列非空就一直迴圈 依次掃瞄目前佇列中所有元素 新增的不算 從佇列取出第一元素 將值放入結果vector中 判斷左右子節點非空,並依次入隊 將本次結果放入二維陣列中 如果需要按層逆序輸出的話,在這裡將二維結果倒排一下 返回二維結果 vector levelo...