前言
这是五月集训的第二十日,今日的训练内容是 二叉搜索树
解题报告
1.力扣700
原题链接
题目概述
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
解题思路
直接使用递归即可。
源码剖析
struct TreeNode* searchBST(struct TreeNode* root, int val){
if (root == NULL) {
return NULL;
} else {
if (root->val > val) {
return searchBST(root->left, val);
} else if (root->val < val) {
return searchBST(root->right, val);
} else {
return root;
}
}
}
2.力扣230
原题链接
题目概述
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
解题思路
直接中序遍历就可以了。
源码剖析
void first(struct TreeNode* root,int *ans,int *num){
if(root==NULL){
return ;
}
first(root->left,ans,num);
ans[(*num)++]=root->val;
first(root->right,ans,num);
}
int kthSmallest(struct TreeNode* root, int k){
int ans[10005];
int *len=0;
first(root,ans,&len);
return ans[k-1];
}
3.力扣108
原题链接
题目概述
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
解题思路
使用类似二分法的做法将数组不断拆分填入结点。
源码剖析
struct TreeNode* build(int* nums, int left, int right)
{
if (left > right)
{
return NULL;
}
int mid = left + (right - left) / 2;
struct TreeNode* pRoot = (struct TreeNode*)malloc(sizeof(struct TreeNode));
pRoot->val = nums[mid];
pRoot->left = build(nums, left, mid - 1);
pRoot->right = build(nums, mid + 1, right);
return pRoot;
}
struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
return build(nums, 0, numsSize - 1);
}
4.力扣1382
原题链接
题目概述
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。
解题思路
只要把现在的树进行中序遍历填入数组之后,数组就变成了有序的数组,然后再用上一题的办法构建二叉树,因为是类似二分法所以最后得到的树肯定是平衡树。
源码剖析
#define N 50000
void getSum(struct TreeNode*root,int *Sum,int *size) //获取中序遍历
{
if(!root)
{
return;
}
getSum(root->left,Sum,size);
Sum[(*size)++]=root->val;
getSum(root->right,Sum,size);
}
struct TreeNode*BinaryCreate(int *Sum,int low,int high) //二分思想构造AVL
{
if(low>high)
{
return NULL;
}
int mid=(low+high)/2;
struct TreeNode*root=malloc(sizeof(struct TreeNode));
root->val=Sum[mid];
root->left=BinaryCreate(Sum,low,mid-1);
root->right=BinaryCreate(Sum,mid+1,high);
return root;
}
struct TreeNode* balanceBST(struct TreeNode* root){
int*Sum=malloc(sizeof(int)*N);
int size=0;
getSum(root,Sum,&size);
return BinaryCreate(Sum,0,size-1);
}