面試題7 重建二叉樹

2021-10-02 17:09:57 字數 1742 閱讀 7085

t7.輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

解題思路:

1.找出二叉樹的根節點

2.構建左子樹----->找出該左子樹的根節點,構建該左字樹的左子樹,構建該左子樹的右子樹…直到序列中沒有左子樹的序列

3.構建右子樹----->找出該右子樹的根節點,構建該右字樹的左子樹,構建該右子樹的右子樹…直到序列中沒有右子樹的序列

注:我們的目的就是要得到每個節點的值,也就是當前的根節點,直到該根節點沒有左右子樹為止

第一次

/**

* definition for binary tree

* struct treenode

* };

*/class

solution

}//vector::iterator index = find(inorder.begin(),inorder.end(),preorder[0]);此法不通

//將左子樹的前序和中序分別存入兩個vector中

for(

int i=

0; i ++i)

//將右子樹的前序和中序分別存入兩個vector中

for(

int i = mid +

1; i ++i)

//將左右子樹連線在根節點上,並進行遞迴實現

root-

>left =

reconstructbinarytree

(left_pre , left_in)

; root-

>right =

reconstructbinarytree

(right_pre , right_in)

;return root;

//最裡層的root為preorder[0];}}

;

參考
/**

* definition for binary tree

* struct treenode

* };

*//*分析:先拿著前序的根,去中序中陣列中,找到以這個根為一棵樹的左右子樹,

然後將左子樹的前序、中序找出來存在兩個vector中,去構建左子樹;將右子樹的前序、

中序存在兩個vector中,構建右子樹,然後鏈在當前根的左右兩邊。

(以上過程是遞迴的,直到中序的vector中元素是0個了,即返回乙個空結點給上一層,否則就返回當前根結點)

*/class

solution

}//將當前樹左子樹的前序、中序放到對應的vector中

for(

int i =

0;i < mid; i++

)//將當前樹右子樹的前序、中序放到對應的vector中

for(

int i = mid +

1;i < len; i++

)//將左子樹、右子樹,掛在當前樹兩邊(遞迴)

root-

>left=

reconstructbinarytree

(left_pre,left_vin)

; root-

>right=

reconstructbinarytree

(right_pre,right_vin)

;return root;}}

;

面試題7 重建二叉樹

對vector使用指標 include include include using namespace std int main vector seq 3 vector curr 0 for int j 0 j 3 j getchar struct treenode struct listnode ...

面試題7 重建二叉樹

一 題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出圖2.6所示的二叉樹並輸出它的頭結點。二 關鍵 根據前序找根節點,從而在中序中找到左子樹對應的序列,右子樹對應的序列。三 解釋 四 i...

面試題7 重建二叉樹

面試題7 重建二叉樹 題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸 入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出 圖所示的二叉樹並輸出它的頭結點。假裝有圖.jpg 1 2 3 4 5 6 7 8 在preorder inord...