剑指offer-面试题7-重建二叉树-二叉树

Posted buaazhhx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer-面试题7-重建二叉树-二叉树相关的知识,希望对你有一定的参考价值。

/*
题目:
	输入二叉树的前序遍历和中序遍历的结果,重建二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。
*/
/*
思路:
	使用前序遍历找到根节点,再通过中序遍历找到左子树和右子树。
	采用递归的方法建立。
*/
struct BinaryTreeNode{
	int value;
	BinaryTreeNode* left;
	BinaryTreeNode* right
}

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 *preOrder,int* endPreOrder,int* inOrder,int *endInOrder){
	BinaryTreeNode* root = new BinaryTreeNode();
	root->value = *preOrder;
	root->left = null;
	root->right = null;
	
	if(preOrder == endInOrder){
		if(inOrder == endInOrder && preOrder == inOrder){
			return root;
		}
		else{
			throw std::exception("Invalid input");
		}
	}
	
	//在中序遍历中找到根节点
	int* rootInorder = inOrder;
	while(rootInorder <= endInOrder && *rootInorder != root->value){
		rootInorder++;
	}
	
	int leftLength = rootInorder - inOrder;
	int *leftPreOrderEnd = preOrder + leftLength;
	
	//创建左子树
	if(leftLength > 0){
		root->left = ConstructCore(preOrder+1,leftPreOrderEnd,inOrder,rootInorder-1);
	}
	
	if(leftLength < endPreOrder - preOrder){
		root->right = ConstructCore(leftPreOrderEnd+1,endPreOrder,rootInorder+1,endInOrder);
	}
	return root;
}
	
	
	
	

   

以上是关于剑指offer-面试题7-重建二叉树-二叉树的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer:面试题07.重建二叉树

剑指offer 面试题7.重建二叉树

《剑指offer》第六题(重要!重建二叉树)

剑指offer——python第4题重建二叉树

剑指Offer第四题重建二叉树

剑指Offer_编程题之重建二叉树