Day23|669. 修剪二叉搜索树|108. 将有序数组转换为二叉搜索树|538. 把二叉搜索树转换为累加树


!!!!成功有两个秘诀,一个是坚持到底,一个是永不放弃!!!

669. 修剪二叉搜索树

请添加图片描述
输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]

思路:BST的特性判断范围

如果当前节点node的val小于左值,说明要向node->right(BST特性)寻找节点。
同理 node的val大于右值,说明要向node->left(BST特性,node->left的值小于node->val)寻找节点
一层一层向上返回

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
            if(root==NULL) return root;//(寻找空节点,向上返回空)
            if(root->val > high)//值比high大,向left递归查找
            {
                TreeNode* temp = trimBST(root->left,low,high);
                return temp;
            }
            if(root->val < low)//值比low小,向right递归查找
            {
                TreeNode* temp =trimBST(root->right,low,high);
                return temp;
            }
            root->left=trimBST(root->left,low,high);//节点向左子树搜索符合条件的情况
            root->right=trimBST(root->right,low,high);//同理,右搜索
            return root;
    }
};

108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 的二叉树。

class Solution {
private:
    TreeNode* get(vector<int>& nums,int left, int right)
    {
        if(left > right) return NULL;
        int mid=left+(right-left)/2;//二分??//mid=(left+right)/2
        TreeNode* root= new TreeNode(nums[mid]);
        root->left=get(nums,left,mid-1);
        root->right=get(nums,mid+1,right);
        return root;
    }
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
       //return get(nums,0,nums.size()-1); 得到root,但是你没有在main中定义
        TreeNode* root=get(nums,0,nums.size()-1);
        return root;
    }
};

538. 把二叉搜索树转换为累加树

累加树的定义为树中的一个节点的值为原先树所有大于这个节点值加本身的和
而BST有特性,节点的右节点的值是大于这个节点的值,所以采用 右 根 左 遍历方式

class Solution {
private:
    int cur=0;
    void NewTree(TreeNode* root)//在原有基础上改造BST二叉,所以是void类型
    {
        if(root==NULL) return;//不能返回上一个节点NULL,因为这里没有删除二叉,改造二叉!!!!==坏习惯!!!
        NewTree(root->right);//右逻辑
        //中
        root->val+=cur;//此时root为树最右节点,依次向上返回
        cur=root->val;//让cur值为当前节点的值,为下一次做准备
        //中处理逻辑双指针!
        NewTree(root->left);//左逻辑
    }

public:
    TreeNode* convertBST(TreeNode* root) {
        NewTree(root);
        return root;
    }
};
要将一个以`.txt`格式存储的`yyyymmdd`格式的日期文件转换为对应的年份的第几天(day of year),你可以读取文件中的日期,并使用`datetime`函数创建日期时间对象,并使用`day`函数获取年份中的第几天。以下是一个示例代码: ```matlab filename = 'dates.txt'; % 输入的日期文件名 fileID = fopen(filename, 'r'); % 打开日期文件 dates = textscan(fileID, '%s'); % 读取日期文件中的所有日期 dates = dates{1}; % 将读取结果转换为列向量 fclose(fileID); % 关闭日期文件 n = length(dates); % 获取日期数量 dayOfYear = zeros(n, 1); % 初始化day of year向量 for i = 1:n dateStr = dates{i}; dt = datetime(dateStr, 'InputFormat', 'yyyyMMdd'); % 创建日期时间对象 dayOfYear(i) = day(dt, 'dayofyear'); % 获取年份中的第几天 end ``` 在这个例子中,我们首先定义了输入的日期文件名`filename`,然后使用`fopen`函数打开该文件。接下来,使用`textscan`函数读取日期文件中的所有日期,并将读取结果存储在`dates`变量中。之后,关闭日期文件。 然后,我们获取日期数量,并初始化一个与日期数量相同的零向量`dayOfYear`来保存day of year的结果。通过循环遍历日期向量的每个元素,使用`datetime`函数创建日期时间对象,并将日期字符串解析为对应的日期。最后,使用`day`函数来获取该日期时间对象的年份中的第几天,并将结果存储在`dayOfYear`向量中。 希望这个回答对你有帮助!如果还有其他问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值