題目:
書上給出的原始碼如下:
#include "stdafx.h"
#include "..\utilities\binarytree.h"
#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
) // 在中序遍歷中找到根結點的值
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 _tmain(int argc, _tchar* argv)
"..\utilities\binarytree.h"標頭檔案定義如下
#include "stdafx.h"
#include "binarytree.h"
binarytreenode* createbinarytreenode(int value)
void connecttreenodes(binarytreenode* pparent, binarytreenode* pleft, binarytreenode* pright)
}void printtreenode(binarytreenode* pnode)
else
printf("\n");
}void printtree(binarytreenode* proot)
}void destroytree(binarytreenode* proot)
}
/**
* definition for binary tree
* struct treenode
* };
*/class solution
// int size = pre.size() ;
return core ( pre.begin(), pre.end(), vin.begin(), vin.end() ) ;
}// 核心處理函式(引數先序的頭指標,先序的最後乙個節點後面節點的指標,
//中序的頭指標,中序的最後乙個節點後面的指標)
treenode *core ( vector::iterator startpre, vector::iterator endpre,
vector::iterator startvin, vector::iterator endvin ) else
}/* 從中序中找到根節點的值 */
// 首先使得rootvin指向中序的第乙個節點
vector::iterator rootvin = startvin ;
// 然後在中序中尋找根節點
while ( rootvin != endvin && *rootvin != root->val )
// 如果跳出迴圈是因為在該中序沒有找到value等於rootvalue的,則異常
if ( rootvin == endvin )
// 求出左子樹有幾個節點
int leftlength = rootvin - startvin ;
// 從先序中獲取右子樹的開始節點處即左子樹的end
vector::iterator leftpre = startpre + leftlength + 1;
if ( leftlength > 0 )
if ( endpre - leftpre > 0 )
return root ;}};
劍指offer 二叉樹 二叉樹搜尋樹
package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...
劍指offer 平衡二叉樹
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹 1 重複遍歷結點 參考上一題求二叉樹的深度,先求出根結點的左右子樹的深度,然後判斷它們的深度相差不超過1,如果否,則不是一棵二叉樹 如果是,再用同樣的方法分別判斷左子樹和右子樹是否為平衡二叉樹,如果都是,則這就是一棵平衡二叉樹。但上面的方法在判斷子樹是否...
劍指offer 重建二叉樹
重建二叉樹2.cpp 定義控制台應用程式的入口點。題目描述 輸入乙個二叉樹的前序遍歷和中序遍歷,輸出這顆二叉樹 思路 前序遍歷的第乙個節點一定是這個二叉樹的根節點,這個節點將二叉樹分為左右子樹兩個部分,然後進行遞迴求解 include stdafx.h include vector using na...