面試題7 重建二叉樹

2021-08-29 01:52:22 字數 2917 閱讀 3540

一、題目

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

二、關鍵

根據前序找根節點,從而在中序中找到左子樹對應的序列,右子樹對應的序列。

三、解釋

四、**

#include "..\utilities\binarytree.h"

#include #include binarytreenode* constructcore(int* startpreorder, int* endpreorder, int* startinorder, int* endinorder);

binarytreenode* construct(int* preorder, int* inorder, int length)

binarytreenode* constructcore

( int* startpreorder, int* endpreorder,

int* startinorder, int* endinorder

) // 在中序遍歷中找到根結點的值(下面2行關鍵)

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)

if(leftlength < endpreorder - startpreorder)

return root;

}// ********************測試**********************

void test(char* testname, int* preorder, int* inorder, int length)

catch(std::exception& exception)

}// 普通二叉樹

// 1

// / \

// 2 3

// / / \

// 4 5 6

// \ /

// 7 8

void test1()

; int inorder[length] = ;

test("test1", preorder, inorder, length);

}// 所有結點都沒有右子結點

// 1

// /

// 2

// /

// 3

// /

// 4

// /

// 5

void test2()

; int inorder[length] = ;

test("test2", preorder, inorder, length);

}// 所有結點都沒有左子結點

// 1

// \

// 2

// \

// 3

// \

// 4

// \

// 5

void test3()

; int inorder[length] = ;

test("test3", preorder, inorder, length);

}// 樹中只有乙個結點

void test4()

; int inorder[length] = ;

test("test4", preorder, inorder, length);

}// 完全二叉樹

// 1

// / \

// 2 3

// / \ / \

// 4 5 6 7

void test5()

; int inorder[length] = ;

test("test5", preorder, inorder, length);

}// 輸入空指標

void test6()

// 輸入的兩個序列不匹配

void test7()

; int inorder[length] = ;

test("test7: for unmatched input", preorder, inorder, length);

}int main(int argc, char* argv)

面試題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 重建二叉樹

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

面試題7 重建二叉樹

題目 重建二叉樹 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並輸出它的頭節點。二叉樹節點的定義如下 struct binarytreenode 分析前序遍歷序列的第乙個數字1就是根節...