文章目录
一、700. 二叉搜索树中的搜索
1.原题链接
2.题目描述
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
3.解题思路
二叉搜索树
4.源码
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(root==nullptr){
return nullptr;
}
if(val<root->val){
return searchBST(root->left,val);
}
else if(val>root->val){
return searchBST(root->right,val);
}
return root;
}
};
二、230. 二叉搜索树中第K小的元素
1.原题链接
2.题目描述
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
3.解题思路
二叉树+dfs
4.源码
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
vector<int> res;
dfs(root, res);
return res[k - 1];
}
void dfs(TreeNode* root, vector<int>& res) {
if (!root) return;
dfs(root->left, res);
res.push_back(root->val);
dfs(root->right, res);
}
};
三、108. 将有序数组转换为二叉搜索树
1.原题链接
2.题目描述
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
3.解题思路
二叉搜索树+dfs
4.源码
class Solution {
public:
TreeNode* dfs(vector<int>& nums,int p_left,int p_right)
{
if(p_left>=p_right)return NULL;
int mid = (p_right+p_left)/2;
TreeNode *root = new TreeNode(nums[mid]);
root->left = dfs(nums,p_left,mid);
root->right = dfs(nums,mid+1,p_right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
int len = nums.size();
return dfs(nums,0,len);
}
};
四、1382. 将二叉搜索树变平衡
1.原题链接
2.题目描述
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。
3.解题思路
用中序遍历将二叉树变为数组,再将数组变成平衡二叉树
4.源码
class Solution {
private:
vector<int> vec;
void traversal(TreeNode* cur) {
if (cur == nullptr) {
return;
}
traversal(cur->left);
vec.push_back(cur->val);
traversal(cur->right);
}
TreeNode* getTree(vector<int>& nums, int left, int right) {
if (left > right) return nullptr;
int mid = left + ((right - left) / 2);
TreeNode* root = new TreeNode(nums[mid]);
root->left = getTree(nums, left, mid - 1);
root->right = getTree(nums, mid + 1, right);
return root;
}
public:
TreeNode* balanceBST(TreeNode* root) {
traversal(root);
return getTree(vec, 0, vec.size() - 1);
}
};
总结
第二十天,坚持到底。