目录
- 一、修剪二叉搜索树-LeetCode 669
- 思路
- 实现代码
- 个人代码
- 视频链接代码
- 个人问题
- 二、将有序数组转化为二叉搜索树-LeetCode 108
- 思路
- 实现代码
- 个人问题
- 三.把二叉树搜索转化为累加树-LeeCode 538
- 思路
- 实现代码
- 个人问题
一、修剪二叉搜索树-LeetCode 669
Leecode链接: leetcode 669
文章链接: 代码随想录
视频链接: B站
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。
示例:
输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]
思路
这道题我跟视频链接的思路稍微有点不一样,我用的是后序遍历。优先判断左右子树的状态,如果左右子树都为空,那么该节点就是叶子节点,根据自身值是否满足区间要求返回空或者本身即可。如果不是叶子节点,那么需要对右子树着重判断,因为如果该节点值不满足[low,high]区间,不代表该节点的右子树值不满足这个区间,如果满足就返回右子树的节点,否则返回空。
实现代码
个人代码
//cpp
class Solution {
public:TreeNode* test(TreeNode* root,int low,int high){if(root == nullptr)return root;root->left = test(root->left,low,high);root->right = test(root->right,low,high);if(root->val<low || root->val>high){//不满足区间条件,根据左右子树情况返回不同值if(root->left)return root->left;if(root->right)return root->right;if(root->right == nullptr) return nullptr;}return root;//满足区间条件返回本身}TreeNode* trimBST(TreeNode* root, int low, int high) {return test(root,low,high);}
};
视频链接代码
//cpp
class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root == nullptr ) return nullptr;if (root->val < low) {TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点return right;}if (root->val > high) {TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点return left;}root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子return root;}
};
个人问题
没有明显问题,除了花的时间有点久。
二、将有序数组转化为二叉搜索树-LeetCode 108
Leecode链接: LeetCode 108
文章链接: 代码随想录
视频链接: B站
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵
平衡二叉搜索树。
示例:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
思路
数组是有序的,每次取数组中间值,然后将数组切割,左区间左子树递归处理,右区间右子树递归处理。
实现代码
//cpp
class Solution {
public:TreeNode* build(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 = build(nums,left,mid - 1);node->right = build(nums,mid + 1,right);return node;}TreeNode* sortedArrayToBST(vector<int>& nums) {return build(nums,0,nums.size() - 1);}
};
个人问题
简单题,无明显问题。
三.把二叉树搜索转化为累加树-LeeCode 538
Leecode链接: LeetCode 538
文章链接: 代码随想录
视频链接: B站
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
示例:
输入:[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]
思路
题目其实大意应该是使用右中左遍历的顺序来对节点值重新赋值,使用一个全局变量来保存累加和,然后递归处理每个节点即可,理清这个意思题目就基本知道怎么写了。
实现代码
//cpp
class Solution {
public:int sum = 0;void test(TreeNode* root){if(root == nullptr){return;}test(root->right);//右子树sum = root->val + sum;//更新sum值root->val = sum;//重新赋值test(root->left);//左子树return;}TreeNode* convertBST(TreeNode* root) {test(root);return root;}
};
个人问题
简单题,无明显问题。