660.修剪二叉搜索树
题目链接https://leetcode.cn/problems/trim-a-binary-search-tree
边界是[1,3]
这里的思路是如果这个节点的左子树比最小边界小了,那它的左子树肯定更小,但是这个结点的右子树比这个节点大,所以有可能满足这个条件,上面这个节点0的左子树比最小边界小,我就往它的右子树去递归,只要2下面子树满足了,你return root 我就拿结点的左子树(3的左节点)去接住你,就把要删除的点(0)自动的忽略掉了。
再比如3往右去递归,4超出边界了,4就往左去递归,返回空,那3的右节点连到nullpstr,就删除掉了4
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr)
return nullptr;
else if (root->val < low) {//只要该结点比最小值小,往右去递归
root = trimBST(root->right, low, high);
return root;
} else if (root->val > high) {
root = trimBST(root->left, low, high);//只要该结点比最大值大,往左去递归
return root;
}
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};
108.将有序数组转为二叉搜索树
题目链接https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree
这里的思路应该是因为是升序数组,所以创造的二叉树应该是个金字塔型,像这样(假设
输入数组 [-10, -3, 0, 5, 9])
对应下标 [0, 1, 2, 3, 4, 5]
就是从根节点0开始我的左子树为(0,2)mid就为1,val->left往左去递归
-3这个节点继续去递归到左子树(nums,0,1),mid就为0,val->left往左去递归
-10这个节点继续去递归到左子树(nums,0,0),mid就为0,val->left继续递归
-10这个节点继续去递归到左子树(nums,0,-1),left>right了,返回nullpstr,然后开始返回上去。
其实这些节点不是没有尝试过往右val->right去递归,但是比如因为(nums,1,0)马上就left>rightl,它的右指针就会指向空,正好也构建出对的二叉树
class Solution {
TreeNode* traversal(vector<int>& nums,int left,int right){
if(left>right)return nullptr;//终止条件
int mid=(left+right)/2;
TreeNode*val=new TreeNode(nums[mid]);
val->left=traversal(nums,left,mid-1);
val->right=traversal(nums,mid+1,right);
return val;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traversal(nums,0,nums.size()-1);//这里是左闭右闭类型[0,nums.size()-1]
}
};
538.把二叉搜索树转换为累加树
题目链接https://leetcode.cn/problems/convert-bst-to-greater-tree
这里是要把每一个结点大于等于它的值全部加起来,因为这是个二叉搜索树,一个树里面如果进行中序左中右遍历的话,那么数组排序就是从小到大的排列的,但是本题是要从大到小进行相加,倒序相加那就可以进行右中左遍历的顺序。
class Solution {
public:
int pre=0;//pre初始化要放递归外面,不然无法累次相加
void traversal(TreeNode*root){
if(root==NULL)return;//终止条件
traversal(root->right);//右
root->val+=pre;//中
pre=root->val;
traversal(root->left);//左
}
TreeNode* convertBST(TreeNode* root) {
traversal(root);
return root;
}
};