Leetcode 669. 修剪二叉搜索树
链接:669. 修剪二叉搜索树
thought:
当 当前节点小于目标范围时,说明包括其及其左子树全部部分均小于目标范围,所以将其右子树(满足条件的部分,这里使用递归)移到当前节点位置即可。
当 当前节点大于目标范围时,说明包括其及其右子树全部部分均大于目标范围,所以将其左子树(满足条件的部分,这里使用递归)移到当前节点位置即可。
当满足条件时,直接向下递归即可
完整C++代码如下:
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);
else 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;
}
};
Leetcode 108. 将有序数组转换为二叉搜索树
thought:
本题的要求是平衡二叉搜索,我们可以考虑将数组中间设为头节点,每次向下递归都以每部分的中间为core
完整C++代码如下:
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode*root=traversal(nums,0,nums.size()-1);
return root;
}
TreeNode* traversal(vector<int>& nums,int l,int r){
if(l>r)return NULL;
int mid=(l+r)/2;
TreeNode* root=new TreeNode(nums[mid]);
root->left=traversal(nums,l,mid-1);
root->right=traversal(nums,mid+1,r);
return root;
}
};
Leetcode 538. 把二叉搜索树转换为累加树
thought:
对于一棵二叉搜索树,其中序遍历为从小到大递增,那么我只要逆中序遍历即为由大到小,那只要我在此遍历途中累加全局变量num的值,再把num加到val上即可
完整C++代码如下:
class Solution {
public:
int num=0;
TreeNode* convertBST(TreeNode* root) {
if(!root)return NULL;
convertBST(root->right);
root->val=root->val+num;//当前节点需要加的总值
num=root->val;//用这个不断增加的num遍历树
convertBST(root->left);
return root;
}
};