题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路
首先由前序遍历序列我们可以找出跟节点
接着我们在中序遍历序列找寻跟节点的位置,跟节点左半部分的节点构成左子树,而右半部分的节点构成右子树。
同理我们在左子树和右子树用相同的方法找到相应子树的跟节点,再进行分割。
(分治的思想)
代码
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size() == 0 || inorder.size() == 0)
return nullptr;
return buildTree_Core(preorder,inorder);
}
TreeNode* buildTree_Core(vector<int>& preorder, vector<int>& inorder)
{
TreeNode* pHead = new TreeNode(preorder[0]);
int length = int(preorder.size());
if(length == 1) return pHead;
int i = 0;
for(i =0;i<int(length);i++)
{
if(inorder[i] == preorder[0])//找出跟节点所在位置
break;
}
if(i>0)
{
vector<int> pre_temp_left(i,0);//左子树前序遍历
vector<int> ino_temp_left(i,0);//左子树中序遍历
std::copy(preorder.begin()+1,preorder.begin()+1+i,pre_temp_left.begin());//注意这里迭代器左闭右开的细节
std::copy(inorder.begin(),inorder.begin()+i,ino_temp_left.begin());
pHead->left = buildTree_Core(pre_temp_left,ino_temp_left);
}
int right_l = length-1-i;
if(right_l>0)
{
vector<int> pre_temp_right(right_l,0);//右子树前序遍历
vector<int> ino_temp_right(right_l,0);//右子树中序遍历
std::copy(preorder.begin()+i+1,preorder.end(),pre_temp_right.begin());
std::copy(inorder.begin()+i+1,inorder.end(),ino_temp_right.begin());
pHead->right = buildTree_Core(pre_temp_right,ino_temp_right);
}
return pHead;
}
};
举一反三
题目描述:
根据一棵树的中序遍历与后序遍历构造二叉树。
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
代码
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(postorder.size() == 0 || inorder.size() == 0)
return nullptr;
return buildTree_Core(postorder,inorder);
}
TreeNode* buildTree_Core(vector<int>& postorder, vector<int>& inorder)
{
int length = int(postorder.size());
TreeNode* pHead = new TreeNode(postorder[length-1]);
if(length == 1) return pHead;
int i = 0;
for(i =0;i<int(length);i++)
{
if(inorder[i] == postorder[length-1])
break;
}
if(i>0)
{
vector<int> pre_temp_left(i,0);
vector<int> ino_temp_left(i,0);
std::copy(postorder.begin(),postorder.begin()+i,pre_temp_left.begin());
std::copy(inorder.begin(),inorder.begin()+i,ino_temp_left.begin());
pHead->left = buildTree_Core(pre_temp_left,ino_temp_left);
}
int right_l = length-1-i;
if(right_l>0)
{
vector<int> pre_temp_right(right_l,0);
vector<int> ino_temp_right(right_l,0);
std::copy(postorder.begin()+i,postorder.end()-1,pre_temp_right.begin());
std::copy(inorder.begin()+i+1,inorder.end(),ino_temp_right.begin());
pHead->right = buildTree_Core(pre_temp_right,ino_temp_right);
}
return pHead;
}
};