二叉树重建,整体思想还是找到前序是:根左右,中序是左根右,然后递归调用即可。
// Definition for binary tree
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {
if (pre.size() == 0) return NULL;
if (pre.size() == 1) return new TreeNode(pre[0]);
TreeNode* root = new TreeNode(pre[0]);
pre.erase(pre.begin());
int index = find(vin.begin(), vin.end(), root->val) - vin.begin();
vin.erase(vin.begin() + index);
vector<int> leftpre, leftvin;
vector<int> rightpre, rightvin;
if (index == 0)
{
root->left = NULL;
rightpre.insert(rightpre.begin(),pre.begin() + index, pre.end());
rightvin.insert(rightvin.begin(), vin.begin() + index, vin.end());
root->right = reConstructBinaryTree(rightpre, rightvin);
}
else if (vin.size() - index == 0)
{
leftpre.insert(leftpre.begin(), pre.begin(), pre.begin() + index);
leftvin.insert(leftvin.begin(), vin.begin(), vin.begin() + index);
root->left = reConstructBinaryTree(leftpre, leftvin);
root->right = NULL;
}
else {
//vector<int> leftpre,leftvin;
leftpre.insert(leftpre.begin(), pre.begin(), pre.begin()+index);
leftvin.insert(leftvin.begin(), vin.begin(), vin.begin()+index);
root->left = reConstructBinaryTree(leftpre, leftvin);
//vector<int> rightpre,rightvin;
rightpre.insert(rightpre.begin(), pre.begin() + index, pre.end());
rightvin.insert(rightvin.begin(), vin.begin() + index, vin.end());
root->right = reConstructBinaryTree(rightpre, rightvin);
}
return root;
}
};

京公网安备 11010502036488号