一、題型
輸入是兩個一維陣列,分別表示樹的前/中/後序遍歷和前/中/後序遍歷結果,輸出是輸出二叉樹或層序遍歷或其他。
二、分類
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...