描述
给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。 提示:
- vin.length == pre.length
- pre 和 vin 均无重复元素
- vin出现的元素均出现在 pre里
- 只需要返回根结点,系统会自动输出整颗树做答案对比
数据范围: n ≤ 2000,节点的值 ?10000 ≤ val ≤ 10000 要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
示例1
输入: [1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
返回值:{1,2,3,4,#,5,6,#,7,#,#,8}
说明:返回根节点,系统会输出整颗二叉树对比结果,重建结果如题面图示
示例2
输入:[1],[1]
返回值:{1}
示例3
输入:[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值:{1,2,5,3,4,6,7}
算法思想:递归
解题思路:
二叉树的前序遍历:根左右;中序遍历:左根右 由前序遍历知道根节点之后,能在中序遍历上划分出左子树和右子树。分别对中序遍历的左右子树递归进行这一过程即可建树。
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int n = pre.size();
int m = vin.size();
if(n == 0 || m == 0)
return NULL;
TreeNode *root = new TreeNode(pre[0]);
for(int i = 0; i < vin.size(); i++){
if(pre[0] == vin[i]){
vector<int> leftpre(pre.begin() + 1, pre.begin() + i + 1);
vector<int> leftvin(vin.begin(), vin.begin() + i);
root->left = reConstructBinaryTree(leftpre, leftvin);
vector<int> rightpre(pre.begin() + i + 1, pre.end());
vector<int> rightvin(vin.begin() + i + 1, vin.end());
root->right = reConstructBinaryTree(rightpre, rightvin);
break;
}
}
return root;
}
};
运行时间:7ms 超过3.00% 用C++提交的代码 占用内存:536KB 超过58.91%用C++提交的代码 时间复杂度O(N):N表示二叉树的结点数量 空间复杂度O(N):返回的树占用空间
|