面試題7 重建二叉樹

2022-08-03 15:15:15 字數 1393 閱讀 2130

輸入某二叉樹的前序遍歷和中序遍歷結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建的二叉樹如圖所示:

首先根據前序遍歷序列找到根節點(序列第乙個元素即為根節點),然後在中序遍歷中找到根節點位置,然後遞迴確定左子樹和右子樹,即可完成二叉樹的構建。

struct

binarytreenode

binarytree* construc(int* preorder,int* inorder,int

length)

binarytreenode* construccore(int* startpreorder,int* endpreorder,int* startinorder,int*endinorder)

//在中序遍歷中找到根節點

int* rootinorder =startinorder;

while(rootinorder <= endinorder && *rootinorder !=rootvalue)

++rootinorder;

if(rootinorder == endinorder && *rootinorder !=rootvalue)

throw std::exception("

invalid input.");

int leftlength = rootinorder -startinorder;

int* leftpreorderend = startpreorder +leftlength;

//建立左子樹

if(leftlength > 0

) root->m_pleft = construccore(startpreorder+1,leftpreorderend,startinorder,rootinorder-1

);

//建立右子樹

if(leftlength < endpreorder -startpreorder)

root->m_pright = construccore(leftpreorderend+1,endpreorder,rootinorder+1

,endinorder);

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...