leetcode0912

1、二叉搜索树的最小绝对值差

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

示例:

输入:

   1
    \
     3
    /
   2

输出:
1

解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。

 int getMinimumDifference(TreeNode* root) {
    //二叉查找树中,中间节点的值一定是其左右节点的中间数,因此最小差应该在中间节点与左右节点之间
    //中序遍历二叉查找树,每次比较当前节点与前一节点差值的绝对值与目前resul中保存的最小值的大小,将较小的保存在result中
    int res=INT_MAX,last=INT_MAX;
    Execute(root,last,res);
    return res;
    }
    void Execute(TreeNode* root, int& last, int& res){
        if(root==nullptr){
            return;
        }
        Execute(root->left,last,res);
        res=min(res,abs(root->val-last));
        if(res==0)return;
        last=root->val;
        Execute(root->right,last,res);
    }

2、数组中的K-diff数对

给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k。

示例 1:

输入: [3, 1, 4, 1, 5], k = 2
输出: 2
解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个1,但我们只应返回不同的数对的数量。

 int findPairs(vector<int>& nums, int k) {
        int sum=0;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();++i){
            if((i!=0&&nums[i]!=nums[i-1])||(i==0)){
            for(int j=i+1;j<nums.size();++j){
                if((nums[j]-nums[i])>k)
                    break;
                else if((nums[j]-nums[i])==k){
                    ++sum;
                    break;
                }
              }
            }
        }
        return sum;
    }

3、把二叉搜索树累转换为累加树

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如:

输入: 原始二叉搜索树:
              5
            /   \
           2     13

输出: 转换为累加树:
             18
            /   \
          20     13

TreeNode* convertBST(TreeNode* root) {
        int num=0;
     Excute(root,num);
     return root;
    }
    void Excute(TreeNode* root,int& num){
        if(root!=nullptr){
            Excute(root->right,num);
            root->val=root->val+num;
            num=root->val;
            Excute(root->left,num);
        }
        
    }

4、反转字符串

给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。


    如果剩余字符少于 k 个,则将剩余字符全部反转。
    如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。


 

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

string reverseStr(string s, int k) {
     int i=k;
     for(;i<s.size();i+=2*k){
         reverse(s.begin()+i-k,s.begin()+i);
     }
     reverse(s.begin()+(i-k),s.end());
     return s;
    }

5、二叉树的直径

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例 :
给定二叉树

          1
         / \
        2   3
       / \     
      4   5    

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

int dfs(TreeNode* root){
       if(!root){
           return 0;
       }
       int left=dfs(root->left);
       int right=dfs(root->right);
       ans=max(ans,left+right);
       return max(left,right)+1;

    }
    int diameterOfBinaryTree(TreeNode* root) {
        ans=0;
        dfs(root);
        return ans;
    }
    private:
    int ans;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值