問題是:基於層序遍歷序列+中序遍歷序列唯一建立一棵樹,然後輸出前序,後序遍歷序列。
四種遍歷樹的思路以及**自然不必多言,有趣的是如何由層序+中序建立樹。
首先需要說的是,這個也是遞迴解法。
既然是遞迴解法,就需要想當前層的問題,給定乙個層序遍歷序列+中序遍歷序列,當前能確定的根結點就是層序序列的第乙個值,拿這個去在中序中找到根結點的下標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...