当前位置: 首页剑指offer刷题第五期问题详情 【二叉树专题】剑指 Offer 07. 重建二叉树 本问题对应课程链接:剑指offer刷题第五期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 10 个回答
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
unordered_map<int, int> index; // 使用哈希表来存储中序遍历中每个节点的位置,方便快速寻找
public: &preorder, const vector &inorder, int pre_left, int pre_right, int in_left, int in_right) { & preorder, vector & inorder) {
TreeNode* build(const vector
// 左边界超过右边界,说明已经到达底部,遍历完节点了
if(pre_left > pre_right) return nullptr;
// 前序遍历中的第一个节点为根节点
int pre_root = pre_left;
// 在中序遍历中找到根节点的索引位置
int in_root = index[preorder[pre_root]];
// 构造根节点
TreeNode root = new TreeNode(preorder[pre_root]);
// 左子树的节点数量
int left_size = in_root – in_left;
// 递归构造左子树并连接到根节点
// 先序遍历中从左边界+1开始的left_size的元素对应了中序遍历中,从左边界到根节点索引-1的元素
root->left = build(preorder, inorder, pre_left + 1, pre_left + left_size, in_left, in_root – 1);
// 递归构造右子树,并连接到根节点
// 先序遍历中从左边界+left_size + 1开始到右边界的元素对应了中序遍历中,从根节点索引+1到右边界的元素
root->right = build(preorder, inorder, pre_left + left_size + 1, pre_right, in_root + 1, in_right);
return root;
}
TreeNode buildTree(vector
int n = preorder.size();
// 构造哈希表,记录inorder中节点所在位置
for (int i = 0; i < n; ++i) {
index[inorder[i]] = i;
}
return build(preorder, inorder, 0, n – 1, 0 , n – 1);
}
};
前面201个用例都够了,第202/203只说是该方法时间超时,但是不太服,只想看是否通过。
时间复杂度空间复杂度不会算
自己开始的思路是直接在buildTree高数上进行递归操作,但是引出来的问题是每次传参的时候都需要new int[],导致内存明显浪费。
答案的思路占用空间更小,有对比才能明白这种思路的优势!
根据答案思路写一遍
递归思想:通过前序遍历序列可以得到根节点的值,再通过中序遍历序列可以得到左右子树自己的前序和中序遍历序列,然后递归创建,终止条件是序列为空
时间复杂度O(n),空间复杂度O(n);
1、递归