题目链接:669.修剪二叉搜索树
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
if(root->val < low){
root->left = nullptr;
return trimBST(root->right, low, high);
}
if(root->val > high) {
root->right = nullptr;
return trimBST(root->left, low, high);
}
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};
本来想在这个基础上继续修改,完成释放内存操作,但是改完之后运行老是报错,也没有找到问题在哪:
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr) return nullptr;
if (root->val < low) {
deleteNodes(root->left);
TreeNode* temp = trimBST(root->right, low, high);
delete root;
return temp;
}
if (root->val > high) {
deleteNodes(root->right);
TreeNode* temp = trimBST(root->left, low, high);
delete root;
return temp;
}
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
void deleteNodes(TreeNode* node) {
if (node == nullptr) return;
deleteNodes(node->left);
deleteNodes(node->right);
delete node;
}
};
题目链接:108. 将有序数组转换为二叉搜索树
主要是每次找准根节点在哪个位置上:
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size() == 0) return nullptr;
int size = nums.size() / 2;
TreeNode* curr = new TreeNode(nums[size]);
vector<int> left_sub_tree(nums.begin(), nums.begin() + size);
vector<int> right_sub_tree(nums.begin() + size + 1, nums.end());
curr->left = sortedArrayToBST(left_sub_tree);
curr->right = sortedArrayToBST(right_sub_tree);
return curr;
}
};
题目链接:538. 把二叉搜索树转换为累加树
两次遍历,先得到二叉树节点值的和然后在通过中序遍历更新节点的值。
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
int sum = 0;
nodeValSum(root, sum);
nodeUpdata(root, sum);
return root;
}
void nodeValSum(TreeNode* node, int& sum) {
if(node == nullptr) return;
nodeValSum(node->left, sum);
sum += node->val;
nodeValSum(node->right, sum);
}
void nodeUpdata(TreeNode* node, int& num) {
if(node == nullptr) return;
nodeUpdata(node->left, num);
num = num - node->val;
node->val += num;
nodeUpdata(node->right, num);
}
};