前言
这是六月集训的第二十日,今日的训练内容是 二叉搜索树
解题报告
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.力扣剑指 Offer 54. 二叉搜索树的第k大节点
原题链接
题目概述
给定一棵二叉搜索树,请找出其中第 k 大的节点的值。
解题思路
中序遍历记录下数据得到的就是一个递增排列的序列,将这个序列填入数组中,然后返回倒数第 k 个就可以了。
源码剖析
void mid(struct TreeNode* root,int* returnsize,int* ans){
if(root!=NULL){
mid(root->left,returnsize,ans);
ans[(*returnsize)++] = root->val;
mid(root->right,returnsize,ans);
}
return ;
}
int kthLargest(struct TreeNode* root, int k){
int* ans=(int*)malloc(sizeof(int)*10001);
int returnsize = 0;
mid(root,&returnsize,ans);
return ans[returnsize-k];
}
3.力扣701
原题链接
题目概述
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
解题思路
使用 while()
循环找到 NULL 的位置插入结点就可以了。
源码剖析
struct TreeNode* nodebuild(int val){
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
struct TreeNode* insertIntoBST(struct TreeNode* root, int val){
if(root==NULL){
root = nodebuild(val);
return root;
}
struct TreeNode* node = root;
while(1){
if(val>node->val){
if(node->right!=NULL){
node = node->right;
continue;
}else{
node->right = nodebuild(val);
break;
}
}else{
if(node->left!=NULL){
node = node->left;
continue;
}else{
node->left = nodebuild(val);
break;
}
}
}
return root;
}
4.力扣面试题 04.05. 合法二叉搜索树
原题链接
题目概述
实现一个函数,检查一棵二叉树是否为二叉搜索树。
解题思路
我使用的是比较暴力的做法:直接中序遍历,将遍历的结果存储在数组中,然后遍历数组看是不是每一项都大于前一项,如果不是就直接返回 false,遍历完之后返回 true。
源码剖析
void mid(struct TreeNode* root,int* returnsize,int* ans){
if(root!=NULL){
mid(root->left,returnsize,ans);
ans[(*returnsize)++] = root->val;
mid(root->right,returnsize,ans);
}
return ;
}
bool isValidBST(struct TreeNode* root){
int* ans = (int*)malloc(sizeof(int)*10000);
int returnsize = 0;
mid(root,&returnsize,ans);
for(int i = 1;i<returnsize;++i){
if(ans[i]<=ans[i-1]) return false;
}
return true;
}