669.修剪二叉搜索树
题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)
解题思路:这一题需要涉及到二叉树的删除而且是具有条件判断的删除,使用递归来解决。
1、终止条件:遇到空节点则return。
2、返回类型和传入参数:需要返回的是节点类型,而传入参数应该是当前节点和区间范围。
3、单层递归逻辑:如果当前节点的值小于区间最小值low,则向右子树进行递归,如果当前节点值大于区间最大值high则向左子树进行递归,最后返回根节点。
代码实现:
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == NULL) return NULL;
if(root->val < low){
TreeNode* rightnode = trimBST(root->right,low,high);
return rightnode;
}
if(root->val > high){
TreeNode* leftnode = trimBST(root->left,low,high);
return leftnode;
}
root->left = trimBST(root->left,low,high);
root->right = trimBST(root->right,low,high);
return root;
}
};
108.将有序数组转换成二叉搜索树
题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
解题思路:按照题目要求这题需要构造平衡二叉搜索树,而按照平衡二叉搜索树的特性,即左孩子小于根节点,右孩子大于根节点,我们即可将数组的区间中点设置成根节点,然后将数组划分成左右孩子,再继续到左右孩子里面按照区间中点设置成根节点的规则来构建二叉搜索树,即使用递归的方式来完成。
1、终止条件:本题使用的是左闭右闭区间,所以当区间左索引大于右索引的时候则返回NULL;
2、递归函数返回值类型和传入参数:因为要构建二叉搜索树,所以返回值的类型应该是节点,而传入的参数是数组和数组的左右区间的索引。
3、单层递归逻辑:寻找区间中点,mid = (right + left)/2,将区间中点的值设置成根节点,然后因为是左闭右闭区间,所以向左递归的时候的区间应该是[left,mid-1],向右递归的区间是[mid+1,right]。
代码实现:
class Solution {
public:
TreeNode* traversal(vector<int>&nums,int left,int right){
if(left > right){ //左闭右闭
return nullptr;
}
int mid = (left + right) /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) {
TreeNode* root = traversal(nums, 0, nums.size()-1);
return root;
}
};
538.将二叉搜索树转换成累加树
题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
解题思路:按照题目描述这题就是从二叉搜索树的最后一个元素开始一直向前累加,所以遍历顺序应该是右中左。若将该题转换成一个数组累加例如[1,2,3,4,5],则很容易想到使用双指针从后向前累加的方法来实现,将这个思路带入二叉搜索树同样也可以。
1、终止条件:当节点遍历到空节点的时候则return;
2、返回值类型和传入参数:因为要遍历这个二叉搜索树,所以没有返回值,传入参数应该是当前节点cur。
3、单层递归逻辑:因为遍历顺序是右中左,所以先向右递归,然后中间的处理操作是让cur->val与pre相加(pre是之前定义的一个全局变量,初始值为0),然后将pre赋值为cur->val;
代码实现:
class Solution {
int pre = 0;
void traversal(TreeNode* cur){
if(cur == NULL) return;
traversal(cur->right);//右
cur->val += pre;//中
pre = cur->val;
traversal(cur->left);//左
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};