代码随想录
这个题的难点在于理解怎么修改二叉树,如上题,如果区间为[1,3],那么节点0不满足,此时应该将节点0的右节点作为节点0父节点的新的左节点,而将节点0及其左子树删除;另外,如果某个节点的值大于high,则将该节点及其右子树删除,然后将该节点左子树作为该节点父节点的新的右子树。这是理解本题解法的关键,这样做还是由二叉搜索树的性质决定的。
TreeNode* trimBST(TreeNode* root, int low, int high)
if(root == nullptr) return nullptr;
if(root->val < low) return trimBST(root->right,low,high);
if(root->val > high) 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* pre = nullptr;
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
if(root->val < low) return trimBST(root->right,low,high);
if(root->val > high) return trimBST(root->left,low,high);
root->left = trimBST(root->left,low,high);
root->right = trimBST(root->right,low,high);
return root;
}
};
上面的代码只是将不符合要求的节点移除,并没有真正的删除。
以数组中间点为分割点(偶数是中间两个点任取一个)分割数组,然后递归左右区间。
TreeNode* traversal(vector<int>& nums,int left,int right);
if(left > right) return nullptr;
int mid = (right + left) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums, left, mid - 1);
root->right = traversal(nums, mid + 1, right);
return root;
完整的代码实现如下:
class Solution {
public:
TreeNode* traversal(vector<int>& nums,int left,int right)
{
if(left > right) return nullptr;
int mid = (right + left) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums, left, mid - 1);
root->right = traversal(nums, mid + 1, right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traversal(nums,0,nums.size()-1);
}
};
这个题理解了题目意思之后就很好做了,按照题意,需要以右中左的遍历顺序,因为二叉搜索树中,右节点数值最大,中间节点次之,左节点最小,因此只需要以右中左的顺序遍历二叉树,并用一个全局变量来记录累加值,更新当前节点的数值即可。
void traversal(TreeNode* root);
if(root == nullptr) return;
traversal(root->right); //右
root->val += sum; //中
sum = root->val;
traversal(root->left); //左
完整的代码实现如下:
class Solution {
public:
int sum = 0;
void traversal(TreeNode* root)
{
if(root == nullptr) return;
traversal(root->right); //右
root->val += sum; //中
sum = root->val;
traversal(root->left); //左
}
TreeNode* convertBST(TreeNode* root) {
traversal(root);
return root;
}
};