本题要对二叉搜索树进行裁剪,和前一天对二叉树进行结点删除不同,如果结点小于左边界,结点的右孩子可能在裁剪范围内;如果结点大于右边界,结点的左孩子可能在裁剪范围内。因此,在确定需要裁剪的结点时不能直接返回NULL,而是需要递归遍历其左孩子或右孩子才能确定裁剪范围。
具体代码如下:
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root==NULL)
{
return NULL;
}
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* sortedArrayToBST(vector<int>& nums) {
TreeNode*root=buildtree(nums);
return root;
}
TreeNode*buildtree(vector<int>nums)
{
int size=nums.size();
if(size==0)
{
return NULL;
}
TreeNode*root=new TreeNode(nums[size/2]);
vector<int>lchild(nums.begin(),nums.begin()+size/2);
vector<int>rchild(nums.begin()+size/2+1,nums.end());
root->left=buildtree(lchild);
root->right=buildtree(rchild);
return root;
}
};
本题要将二叉搜索树转换为累加树,遍历顺序应该改为右中左,使用双指针法记录前一个结点的值,将当前结点的的值加上前一个结点的值即可,递归地从二叉搜索树右侧遍历到左侧就完成了结点值的相加。
具体代码如下:
class Solution {
public:
TreeNode*pre=NULL;
TreeNode* convertBST(TreeNode* root) {
if(root==NULL)
{
return NULL;
}
root->right=convertBST(root->right);
if(pre!=NULL)
{
root->val+=pre->val;
}
pre=root;
root->left=convertBST(root->left);
return root;
}
};