1.修剪二叉搜索树
1.如果走到根节点为空,返回给上层空即可
2.如果根节点的数据比low还小,说明此时不需要走左边,因为左边一定比low小,所以左边不需要判断;但是右边无法保证,所以左边还要遍历,那么此时根节点这层返回给上层的是右节点遍历的内容,因为根节点是要被删除的
3.如果根节点的数据比high还大,此时与第二个情况差不多。
class Solution {
public:
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;
}
};
2.有序数组转换为二叉搜索树
为了保持平衡,其实只需要把范围的中间数据作为节点连接两侧即可保持
1.传入left和right对应构建树的范围
2.如果left比right大,说明此时返回nullptr即可
3.left和right的中间mid,nums对应的数构建root节点,该节点的left和right左右递归
4.最后返回root即可
class Solution {
public:
TreeNode* _sortedArrayToBSTR(vector<int>& nums,int left,int right)
{
if(left>right)
return nullptr;
int mid = left+((right-left)>>1);
TreeNode* root = new TreeNode(nums[mid]);
root->left = _sortedArrayToBSTR(nums,left,mid-1);
root->right = _sortedArrayToBSTR(nums,mid+1,right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return _sortedArrayToBSTR(nums,0,nums.size()-1);
}
};
3.累加树
由于是重右边开始到左边的,所以我们想的递归顺序应该是先右后左,当我们走到右边的底部时,我们需要将该节点变成累加的数,那么我们需要在右左中间进行操作,那么顺序就出来了,为右左中。对于我们而言需要得到累加的数,由于遍历顺序就是右到左,那么此时我们直接拿引用参数进行操作即可
1.root为空,返回空
2.先右遍历,中间操作,首先将num的数与当前的根节点进行累加;随后更新根节点的数,最后遍历左边,返回root即可
class Solution {
public:
TreeNode* _convertBSTR(TreeNode* root,int& num)
{
if(root==nullptr)
return nullptr;
_convertBSTR(root->right,num);
num+=root->val;
root->val=num;
_convertBSTR(root->left,num);
return root;
}
TreeNode* convertBST(TreeNode* root) {
int num = 0;
return _convertBSTR(root,num);
}
};