代码随想录刷题第23天

代码随想录刷题第23天

修剪二叉搜索树


/*

* @lc app=leetcode.cn id=669 lang=cpp

*

* [669] 修剪二叉搜索树

*

* https://leetcode.cn/problems/trim-a-binary-search-tree/description/

*

* algorithms

* Medium (67.93%)

 * Likes:    756

* Dislikes: 0

 * Total Accepted:    110.5K

* Total Submissions: 162.6K

 * Testcase Example:  '[1,0,2]\n1\n2'

*

* 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树

* 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

* 

* 所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

* 

* 

* 

* 示例 1:

* 

* 

* 输入:root = [1,0,2], low = 1, high = 2

* 输出:[1,null,2]

* 

* 

* 示例 2:

* 

* 

* 输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3

* 输出:[3,2,null,1]

* 

* 

* 

* 

* 提示:

* 

* 

* 树中节点数在范围 [1, 10^4] 内

* 0 <= Node.val <= 10^4

* 树中每个节点的值都是 唯一 的

* 题目数据保证输入是一棵有效的二叉搜索树

* 0 <= low <= high <= 10^4

* 

* 

*/

 

// @lc code=start

/**

* Definition for a binary tree node.

* struct TreeNode {

 *     int val;

 *     TreeNode *left;

 *     TreeNode *right;

 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}

 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

* };

*/

#include<iostream>

#include <vector>

using namespace std;

 

//   struct TreeNode {

//       int val;

//       TreeNode *left;

//       TreeNode *right;

//       TreeNode(int x) : val(x), left(NULL), right(NULL) {}

//   };

 

class Solution {

public:

    TreeNode * traversal(TreeNode* root, int low, int high){

            if (!root)

            {

                return nullptr;

            }

            if (root->val < low)

            {

                TreeNode *right = traversal(root->right,low,high);

                return right;

            }

            if (root->val > high)

            {

                TreeNode *left = traversal(root->left,low,high);

                return left;

            }

            root->left = traversal(root->left,low,high);

            root->right = traversal(root->right,low,high);

 

            return root;

    }

    TreeNode* trimBST(TreeNode* root, int low, int high) {

        TreeNode *result = traversal(root,low,high);

        return result;

    }

};

// @lc code=end

 

 

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


/*

* @lc app=leetcode.cn id=108 lang=cpp

*

* [108] 将有序数组转换为二叉搜索树

*

* https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/

*

* algorithms

* Easy (77.32%)

 * Likes:    1233

* Dislikes: 0

 * Total Accepted:    329.5K

* Total Submissions: 426.1K

 * Testcase Example:  '[-10,-3,0,5,9]'

*

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

* 

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

* 

* 

* 

* 示例 1:

* 

* 

* 输入:nums = [-10,-3,0,5,9]

* 输出:[0,-3,9,-10,null,5]

* 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

* 

* 

* 

* 示例 2:

* 

* 

* 输入:nums = [1,3]

* 输出:[3,1]

* 解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

* 

* 

* 

* 

* 提示:

* 

* 

* 1 <= nums.length <= 10^4

* -10^4 <= nums[i] <= 10^4

* nums 按 严格递增 顺序排列

* 

* 

*/

 

// @lc code=start

/**

* Definition for a binary tree node.

* struct TreeNode {

 *     int val;

 *     TreeNode *left;

 *     TreeNode *right;

 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}

 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

* };

*/

#include<iostream>

#include <vector>

using namespace std;

 

//   struct TreeNode {

//       int val;

//       TreeNode *left;

//       TreeNode *right;

//       TreeNode(int x) : val(x), left(NULL), right(NULL) {}

//   };

 

class Solution {

public:

 

    TreeNode * traversal(vector<int>& nums,int left,int right){

        if(left > right) return nullptr;

        int mid = (right - left)/2 +left;

        TreeNode *node = new TreeNode(nums[mid]);

        node->left = traversal(nums,left,mid-1);

        node->right = traversal(nums,mid+1,right);

        return node;

    }

 

    TreeNode* sortedArrayToBST(vector<int>& nums) {

        int left = 0;

        int right = nums.size()-1;

        TreeNode *result = traversal(nums,left,right);

        return result;

    }

};

// @lc code=end

 

 

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


/*

* @lc app=leetcode.cn id=538 lang=cpp

*

* [538] 把二叉搜索树转换为累加树

*

* https://leetcode.cn/problems/convert-bst-to-greater-tree/description/

*

* algorithms

* Medium (75.89%)

 * Likes:    842

* Dislikes: 0

 * Total Accepted:    210.1K

* Total Submissions: 276.8K

 * Testcase Example:  '[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]'

*

* 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node

* 的新值等于原树中大于或等于 node.val 的值之和。

* 

* 提醒一下,二叉搜索树满足下列约束条件:

* 

* 

* 节点的左子树仅包含键 小于 节点键的节点。

* 节点的右子树仅包含键 大于 节点键的节点。

* 左右子树也必须是二叉搜索树。

* 

* 

* 注意:本题和 1038:

* https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/

* 相同

* 

* 

* 

* 示例 1:

* 

* 

* 

* 输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]

* 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

* 

* 

* 示例 2:

* 

* 输入:root = [0,null,1]

* 输出:[1,null,1]

* 

* 

* 示例 3:

* 

* 输入:root = [1,0,2]

* 输出:[3,3,2]

* 

* 

* 示例 4:

* 

* 输入:root = [3,2,4,1]

* 输出:[7,9,4,10]

* 

* 

* 

* 

* 提示:

* 

* 

* 树中的节点数介于 0 和 10^4^ 之间。

* 每个节点的值介于 -10^4 和 10^4 之间。

* 树中的所有值 互不相同 。

* 给定的树为二叉搜索树。

* 

* 

*/

 

// @lc code=start

/**

* Definition for a binary tree node.

* struct TreeNode {

 *     int val;

 *     TreeNode *left;

 *     TreeNode *right;

 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}

 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

* };

*/

 

#include<iostream>

#include <vector>

using namespace std;

 

//   struct TreeNode {

//       int val;

//       TreeNode *left;

//       TreeNode *right;

//       TreeNode(int x) : val(x), left(NULL), right(NULL) {}

//   };

 

class Solution {

public:

    int pre = 0;

    void traversal(TreeNode* root){

        if(!root) return ;

        traversal(root->right);

        pre = pre + root->val;

        root->val = pre;

        traversal(root->left);

    }

    TreeNode* convertBST(TreeNode* root) {

        traversal(root);

        return root;

    }

};

// @lc code=end

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值