《五月集训》第二十天——二叉搜索树
文章目录
- 前言
- 💎一、题目一
-
- 🏆1.题目描述
- 🏆2.解题思路
- 🏆3.代码详解
- 💎二、题目二
-
- 🏆1.题目描述
- 🏆2.解题思路
- 🏆3.代码详解
- 💎三、题目三
-
- 🏆1.题目描述
- 🏆2.解题思路
- 🏆3.代码详解
- 💎四、题目四
-
- 🏆1.题目描述
- 🏆2.解题思路
- 🏆3.代码详解
- 💎五、星球推荐
前言
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。
刷题坚持每一天,以下题目引用自:力扣(LeetCode)
💎一、题目一
🏆1.题目描述
原题链接:700. 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
示例 1:
输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]
🏆2.解题思路
🔑思路:
前序遍历,当节点值等于
val
时,返回当前节点的链接。
🏆3.代码详解
struct TreeNode* dfs(struct TreeNode* root, int* val){ if(!root || root->val == *val) return root; if(root->val > *val){ return dfs(root->left, val); } else if(root->val < *val){ return dfs(root->right, val); } return;}struct TreeNode* searchBST(struct TreeNode* root, int val){ if(root == NULL) return NULL; return dfs(root, &val);}
💎二、题目二
🏆1.题目描述
原题链接:230. 二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
🏆2.解题思路
🔑思路:
根据二叉搜索树的特点,使用中序遍历会得到由小到大的有序数据。把k值进行递减为零,返回
k
值为零时所在节点的值。
🏆3.代码详解
void dfs(struct TreeNode* root, int* k, int* ans){ if(root == NULL) return; dfs(root->left, k, ans); if(--(*k) == 0) *ans = root->val; dfs(root->right, k, ans);}int kthSmallest(struct TreeNode* root, int k){ int ans = 0; dfs(root, &k, &ans); return ans;}
💎三、题目三
🏆1.题目描述
原题链接:108. 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
🏆2.解题思路
🔑思路:
把数组从中间分开,根节点始终取中间左边的值。数组左边组成左子树,数组右边组成右子树,都时按照开头写的方式分。
🏆3.代码详解
struct TreeNode* dfs(int* nums, int left, int right){ if(left > right) return NULL; int mid = (left+right)/2; struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = nums[mid]; node->left = dfs(nums, left, mid-1); node->right = dfs(nums, mid+1, right); return node;}struct TreeNode* sortedArrayToBST(int* nums, int numsSize){ return dfs(nums, 0, numsSize-1);}
💎四、题目四
🏆1.题目描述
原题链接:1382. 将二叉搜索树变平衡
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。
示例 1:
输入:root = [1,null,2,null,3,null,4,null,null]
输出:[2,1,3,null,null,null,4]
解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。
🏆2.解题思路
🔑思路:
使用中序遍历得到树的所有节点值,在进行建立二叉搜索树,参考上一题。
🏆3.代码详解
void inorder(struct TreeNode* root, int* nums, int* index){ if(root == NULL) return; inorder(root->left, nums, index); nums[(*index)++] = root->val; inorder(root->right, nums, index);}struct TreeNode* dfs(int* nums, int left, int right){ if(left > right) return NULL; int mid = (left+right)/2; struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = nums[mid]; node->left = dfs(nums, left, mid-1); node->right = dfs(nums, mid+1, right); return node;}struct TreeNode* balanceBST(struct TreeNode* root){ int nums[10001] = {0}; int index = 0; inorder(root, nums, &index); return dfs(nums, 0, index-1);}
💎五、星球推荐
星球链接:英雄算法联盟
星球里有什么?
【朋友圈】一个极致精准的自律、编程、算法的小圈子。
【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
目前星球人数达到420+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。