剑指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;
}
	
	
	
	

   

原文地址:https://www.cnblogs.com/buaaZhhx/p/11809036.html