輸入某二叉樹的前序遍歷和中序遍歷結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列
,則重建的二叉樹如圖所示:
首先根據前序遍歷序列找到根節點(序列第乙個元素即為根節點),然後在中序遍歷中找到根節點位置,然後遞迴確定左子樹和右子樹,即可完成二叉樹的構建。
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...