Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7
这道题和 leetcode如出一辙,都是通过两个序列来构造二叉树。前序序列是按照(根-左-右)排序,中序序列(左-根-右),由于对前序序列根永远排在第一个,所以
preorder[pre_start]

是当前序列的根节点,我们通过查找inorder的preorder[pre_start]可以找到inorder的根节点序号,然后inoder被根节点分为左右两部分,对左边部分,根节点,右边部分分别调用自身执行构造左右子树。

TreeNode* buildTreeCore(vector<int>& preorder, vector<int>& inorder, int pre_start, int pre_end, int in_start, int in_end) {
	if (pre_start > pre_end || in_start > in_end) {
		return nullptr;
	}
	if (pre_start == pre_end && in_start == in_end) {
		return new TreeNode(preorder[pre_start]);
	}
	TreeNode *node = new TreeNode(preorder[pre_start]);
	int i = 0;
	for (; i < inorder.size(); i++) {
		if (inorder[i] == preorder[pre_start]) {
			break;
		}
	}
	//int in_mid = getMid(inorder, in_start, in_end, preorder[pre_start]);
	//int pre_mid = ((in_mid - 1 )>= in_start )? getMid(preorder, in_start, in_end, inorder[in_mid - 1]) : -1;
	node->left = buildTreeCore(preorder, inorder, pre_start + 1, pre_start+i-in_start, in_start, i - 1);
	node->right = buildTreeCore(preorder, inorder, pre_start + i - in_start+1, pre_end, i + 1, in_end);
	return node;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
	if (preorder.empty() || inorder.empty()) {
		return nullptr;
	}
	int pre_start = 0;
	int pre_end = preorder.size() - 1;
	int in_start = 0;
	int in_end = inorder.size() - 1;
	if (pre_end != in_end) {
		return nullptr;
	}
	return buildTreeCore(preorder, inorder, pre_start, pre_end, in_start, in_end);
}


猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/80545674