《劍指offer》第七題(重要!重建二叉樹)

2022-09-07 23:12:28 字數 3784 閱讀 1245

檔案一:main.cpp

//

面試題:重建二叉樹

//題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸

//入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出

//圖2.6所示的二叉樹並輸出它的頭結點。

#include

#include

"binarytree.h

"using

namespace

std;

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)//

注意傳入的是位址

//在中序遍歷中找到根結點的值

int* rootinorder =startinorder;

while (rootinorder <= endinorder && *rootinorder != startpreorder[0

]) ++rootinorder;

if (rootinorder == endinorder && *rootinorder != startpreorder[0])//

如果中序遍歷中沒有根節點,就丟擲異常

throw exception("

invalid input.");

int leftlength = rootinorder - startinorder;//

計算左孩子子樹個數

int* leftpreorderend = startpreorder +leftlength;

if (leftlength > 0)//

遞迴的構建子樹

if (leftlength < endpreorder -startpreorder)

return

root;}//

********************測試**********************

void test(const

char* testname, int* preorder, int* inorder, int

length)

catch (exception&exception)

}//普通二叉樹//1

/// \

//2 3

/// / \

//4 5 6

//\ /

//7 8

void

test1()

;

int inorder[length] = ;

test(

"test1

", preorder, inorder, length);}//

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

///

//2

///

//3 ///

//4///

//5void

test2()

;

int inorder[length] = ;

test(

"test2

", preorder, inorder, length);}//

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

//\

//2

//\

//3 //\

//4//\

//5void

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*ar**)

檔案二:binarytree.h

#ifndef binary_tree_h

#define binary_tree_h

struct

binarytreenode

;binarytreenode* createbinarytreenode(int

value);

void connecttreenodes(binarytreenode* pparent, binarytreenode* pleft, binarytreenode*pright);

void printtreenode(const binarytreenode*pnode);

void printtree(const binarytreenode*proot);

void destroytree(binarytreenode*proot);

#endif

檔案三:binarytree.cpp

#include #include 

"binarytree.h

"using

namespace

std;

binarytreenode* createbinarytreenode(int value)//

建立乙個二叉樹節點

void connecttreenodes(binarytreenode* pparent, binarytreenode* pleft, binarytreenode* pright)//

將兩個孩子連線到乙個父節點

}void printtreenode(const binarytreenode* pnode)//

列印當前二叉樹節點

else

cout

<}void printtree(const binarytreenode* proot)//

列印整個樹

}void destroytree(binarytreenode* proot)//

刪除整個樹

}

劍指offer(java版) pdf 第七題

大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項。n 39 對於斐波拉契數列,我們首先想到的是她的表示式 斐波拉契數列的表示式 f 0 0,f 1 1,f n f n 1 f n 2 n 2,n n 下面我們直接根據表示式使用遞迴來實現斐波拉契數列 public clas...

兩個棧實現乙個佇列 劍指offer第七題

題目描述 解題思路 我們定義兩個棧stack1和stack2,stack1用來插入元素,當要刪除元素時,首先將stack1中的所有元素全部push到stack2中,這樣stack1棧頂的元素就到了stack2棧底,stack1棧底的元素就到了stack2棧頂,再將其出棧。只有當stack2為空時再將...

劍指offer第二題

最直觀的做法是從頭往後開始掃瞄,但是這樣複雜度為o n 2 o n 的做法是從後往前開始複製和替換。先求出替換後的字串大小,然後用兩個指標 index 從後往前複製,如果遇上空格,直接替換為 20 public class solution int oldindex str.length 1 int...