题目来源:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
题目大意
- 递归与分治,将全局问题分解为局部的子问题,通过解决子问题来合并整体问题
- 递归终止条件为递归时两个参数有一个为空时
递归
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty() || inorder.empty())
return nullptr;
TreeNode* head = new TreeNode(preorder[0]);
int root = 0;
for(int i = 0 ; i < preorder.size(); ++i){
// 维护 preorder[0] 为 容器首部元素
if(inorder[i] == preorder[0]){
root = i;
break;
}
}
vector<int> newLeftPre, newLeftIn;
vector<int> newRightPre, newRightIn;
for(int i = 0 ; i < root ; ++i){
// 写为preorder[i],会导致第一次分治添加preorder[0]
// 则在下次递归时preorder[0]还是根节点
newLeftPre.push_back(preorder[i + 1]);
newLeftIn.push_back(inorder[i]);
}
for(int i = root + 1; i < preorder.size(); ++i){
newRightPre.push_back(preorder[i]);
newRightIn.push_back(inorder[i]);
}
head->left = buildTree(newLeftPre, newLeftIn);
head->right = buildTree(newRightPre, newRightIn);
return head;
}
};
复杂度分析
- 时间复杂度:O(n)。n为数组的长度
- 空间复杂度:O(n)。递归栈所用空间为O(n)