檔案一: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...