输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:中序遍历和先序遍历的原理就不说了,总之这两种遍历可确定一棵二叉树,而且遍历也比较简单。
个人感觉对这题倒是对指针要求更多一点。。。
//剑指offer07
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty())
return nullptr;
TreeNode *root = new TreeNode(*preorder.begin());
vector<int>::iterator it = inorder.begin();
for (; it != inorder.end(); ++it)
{
if (*it == *(preorder.begin())) break;
}
vector<int> leftin(inorder.begin(), it);
vector<int> rightin(it+1, inorder.end());
int len = leftin.size();
vector<int> leftpre(preorder.begin()+1, preorder.begin()+1+len);
vector<int> rightpre(preorder.begin()+1+len, preorder.end());
root->left = buildTree(leftpre, leftin);
root->right = buildTree(rightpre, rightin);
return root;
}