修剪二叉搜索树
题目链接:leetcode669
思路:
- 因为是二叉搜索树,所以非常容易判断的是,当根节点的值小于low时,那么它的左节点必然也小于,直接return 右孩子即可。当它的根节点的值大于high时,直接return左孩子即可。
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high)
{
if(root == NULL) return root;
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
if(root->val > high) return root->left;
if(root->val < low) return root->right;
return root;
}
};
将有序数组转换为二叉搜索树
题目链接:leetcode108
思路:
- 二叉搜索树的根是数组中的中值,并且所有的子树的根都满足这一条件。
- 那么二叉树的左子树的根满足左侧数组的中值,右子树满足右侧数组的中值。
class Solution {
public:
TreeNode* sortedArrayToBST_1(vector<int>& nums, int left, int right){
if(left==right) return nullptr;
int index = left + (right - left)/2;
int val = nums[index];
TreeNode * newroot = new TreeNode(val);
newroot->left = sortedArrayToBST_1(nums, left, index);
newroot->right = sortedArrayToBST_1(nums, index+1, right);
return newroot;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return sortedArrayToBST_1(nums, 0, nums.size());
}
};
把二叉搜索树转换为累加树
题目链接:leetcode538
思路:
其实就是按照从右到左的中序遍历,将节点数值不断累加即可。
class Solution {
public:
int sum = 0;
TreeNode* convertBST(TreeNode* root)
{
if(!root) return root;
convertBST(root->right);
root->val = root->val + sum;
sum = root->val;
convertBST(root->left);
return root;
}
};