《六月集训》第二十日——二叉搜索树

前言

这是六月集训的第二十日,今日的训练内容是 二叉搜索树

解题报告

1.力扣700

原题链接

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大节点

原题链接

剑指 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

原题链接

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. 合法二叉搜索树

原题链接

面试题 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值