第三十一天(2):面试算法题---树

重建二叉树

树的结构
struct BinaryTreeNode{
	int m_nValue;
	BinaryTreeNode* m_pLeft;
	BinaryTreeNode* m_pRight;
}

通过前序遍历和中序遍历的结果来构造树

BinaryTreeNode* Construct(int* preorder, int* inorder, int length){
	if(preorder == NULL || inorder == NULL || length <= 0)
		return NULL;
	return ConstructCore(preorder, preorder + length - 1, inorder, inorder + length - 1);

BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder){
	int rootValue = startPreorder[0];
	
	BinaryTreeNode* root = new BinaryTreeNode();
	root->m_nValue = rootValue;
	root->m_pLeft = root->m_pRight = NULL;
	
	//前序遍历序列第一个数字是根节点的值
	if(startPreorder == endPreorder){
		if(startPreorder == endPreorder && *startPreorder == *startInorder)
			return root;
		else
			throw std::exception("Invalid Input.");
	
	//在中序遍历中找到根节点的值
	int* rootInorder = startInorder;
	while(rootInorder <= endInorder && *rootInorder	!= rootValue)
		++rootInorder;
	if(rootInorder > endInorder)
		throw std::exception("Invalid Input.");
	int leftLength = rootInorder - startInorder;
	int *leftPreorderEnd = startPreorder + leftLength;
	if(leftPreorder > 0){
		root->m_pLeft = ConstructCore(startPreorder + 1, leftPreorderEnd, startInorder, rootInorder - 1);
	 
		
发布了182 篇原创文章 · 获赞 101 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/lancecrazy/article/details/100936828