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

前言

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

解题报告

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.力扣230

原题链接

230. 二叉搜索树中第K小的元素

题目概述

给定一个二叉搜索树的根节点 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

原题链接

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

原题链接

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);


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值