基於層序 中序遍歷序列構建二叉樹

2021-07-27 15:41:35 字數 2133 閱讀 2094

問題是:基於層序遍歷序列+中序遍歷序列唯一建立一棵樹,然後輸出前序,後序遍歷序列。

四種遍歷樹的思路以及**自然不必多言,有趣的是如何由層序+中序建立樹。

首先需要說的是,這個也是遞迴解法。

既然是遞迴解法,就需要想當前層的問題,給定乙個層序遍歷序列+中序遍歷序列,當前能確定的根結點就是層序序列的第乙個值,拿這個去在中序中找到根結點的下標k,就劃分出來了左右子樹。

現在問題就有意思了,左子樹在層序中的序列不是在一團的,而是散開的,換句話說,左子樹的和右子樹的層序遍歷序列是交叉在一起的,怎麼辦?

我們想,如果能夠有左子樹的層序遍歷序列和右子樹的層序遍歷序列就好了。

這個其實是非常漂亮的觀點,基於這個就能夠解決問題。

開兩個陣列專門存左右子樹的遍歷序列即可

我重寫的乙個版本:

#include

#include

#include

using

namespace std;

const

int maxn =40;

int in[maxn]

;vector<

int> layer;

vector<

int> pre,post;

// 先存再輸出也行,但是耗費一點時間

struct node

;node*

newnode

(int val)

void

preorder

(node* root)

void

postorder

(node* root)

node*

createfromlevelinorder

(vector<

int> layer,

int inl,

int inr)

// 處理當前層的問題

node* root =

newnode

(layer[0]

);int k;

//在中序中劃分

for(k = inl; k <= inr; k++)}

vector<

int> leftlayer;

// 左子樹層序遍歷序列

vector<

int> rightlayer;

// 右子樹層序遍歷序列

for(

int i =

1; i < layer.

size()

; i++

)// 遍歷當前層序,劃分左右儲存起來}if

(isleft)

else

}// 尤其需要注意這裡需要用root的左右指標去接下一層的構造

root-

>left =

createfromlevelinorder

(leftlayer,inl, k -1)

; root-

>right =

createfromlevelinorder

(rightlayer,k +

1, inr)

;return root;

}int

main()

for(

int i =

0; i < n; i++

) node* root =

createfromlevelinorder

(layer,

0,n -1)

;preorder

(root)

;postorder

(root)

;// 控制輸出

for(

int i =

0; i < pre.

size()

; i++)}

printf

("\n");

for(

int i =

0; i < post.

size()

; i++)}

printf

("\n");

return0;

}

end.

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

給定乙個二叉樹,返回該二叉樹層序遍歷的結果,從左到右,一層一層地遍歷 例如 給定的二叉樹是,該二叉樹層序遍歷的結果是 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...