算法训练营day23_二叉树(3.4补)
669.修剪二叉搜索树
懒得想了,修改树的结构比赛中没遇到过,之后有需要再来看吧;
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int L, int R) {
if (!root) return nullptr;
// 处理头结点,让root移动到[L, R] 范围内,注意是左闭右闭
while (root != nullptr && (root->val < L || root->val > R)) {
if (root->val < L) root = root->right; // 小于L往右走
else root = root->left; // 大于R往左走
}
TreeNode *cur = root;
// 此时root已经在[L, R] 范围内,处理左孩子元素小于L的情况
while (cur != nullptr) {
while (cur->left && cur->left->val < L) {
cur->left = cur->left->right;
}
cur = cur->left;
}
cur = root;
// 此时root已经在[L, R] 范围内,处理右孩子大于R的情况
while (cur != nullptr) {
while (cur->right && cur->right->val > R) {
cur->right = cur->right->left;
}
cur = cur->right;
}
return root;
}
};
108.将有序数组转换为二叉搜索树
采用递归,每层处理一个节点,参数就是数组,l,r;
数组中为空的时候,返回NULL;
先找到中间点,作为当前节点的值,递归左边作为左子树,递归右边作为右子树;
class Solution {
public:
TreeNode* dfs(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=dfs(nums,l,mid-1);
root->right=dfs(nums,mid+1,r);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return dfs(nums,0,nums.size()-1);
}
};
538.把二叉搜索树转换为累加树
先遍历搜一遍收集总和;
然后中序遍历,赋给中间节点之后减去中间节点之前的值;
class Solution {
public:
int sum;
int findSum(TreeNode* root){
if(root==NULL) return 0;
return root->val+findSum(root->left)+findSum(root->right);
}
TreeNode* dfs(TreeNode* root){
if(root==NULL) return NULL;
dfs(root->left);
int t=root->val;
root->val=sum;
sum-=t;
dfs(root->right);
return root;
}
TreeNode* convertBST(TreeNode* root) {
sum=findSum(root);
cout<<sum<<endl;
return dfs(root);
}
};