首页 > 其他分享 >【11月LeetCode组队打卡】Task4--BinarySearchTree

【11月LeetCode组队打卡】Task4--BinarySearchTree

时间:2023-11-24 22:00:15浏览次数:25  
标签:11 Task4 val return TreeNode 打卡 root 节点 left

Review

  • 有数值

  • 有序树:lch< root< rch

递归和迭代遍历不同于普通二叉树

搜索BST

700.二叉搜索树中的搜索

  • 有:返回以存储val节点为根的子树

  • 无:NULL

AC1:递归

  • 参数和返回值:

    • 根节点 & 待寻值

    • 节点

  • 终止条件:根为空||匹配到val

  • 单层逻辑:

    • 有序树:从左到右搜索

    • 返回值为节点类型,记得定义一个变量存储节点

#include<iostream>
#include"TreeNode.h"
using namespace std;

TreeNode* BST(TreeNode* root,int val){
    if(root==nullptr ||  root->val==val)
        return root;
    TreeNode* result;
    if(root->val>val)
        result=BST(root->left,val);
    if(root->val<val)
        result=BST(root->right,val);
    return result;
}

int main(){
    //建树
    return 0;
}

AC2:迭代

  • 对于迭代,通常:

    • 用stack栈模拟DFS深度遍历

    • 用queue队列模拟BFS广度遍历

  • 但对于BST,由于其有序,可以不用DS辅助

TreeNode* InteratinBST(TreeNode* root,int val){
    while(root!=nullptr){
        if(root->val>val)
            root=root->left;
        else if(root->val<val)
            root=root->right;
        else return root;
    }
    return nullptr;
}

插入BST

[701. 二叉搜索树中的插入操作](https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/)

  • 将值放入树,返回BST的根节点

  • 存在多种有效的插入方式

  • 不用调整二叉树的结构

  • 只需要遍历树,找到空节点并插入即可

递归:

  • 参数及返回值:

    • TreeNode*

    • 返回根节点--每一次递归返回都要用上一层的节点接住

    • root , val(插入值)

  • 终止条件:找到合适的空节点并插入数值

  • 单层逻辑:搜索数值

AC:

#include<iostream>
#include"TreeNode.h"
using namespace std;

TreeNode* insertIntoBST(TreeNode* root,int val){
    if(root==nullptr){
        TreeNode *node=new TreeNode(val);
        return node;
    }
    //返回根节点,所以每一次向子树搜索,都要存储根节点
    if(root->val>val) root->left=insertIntoBST(root->left,val);
    if(root->val<val) root->right=insertIntoBST(root->right,val);
    return root;
}

int main(){

    return 0;
}

删除BST中的节点

450.删除二叉搜索树中的节点

  • 要考虑多种情况,比插入节点复杂

< auto >

  • 根据初始化表达式自动判断变量类型

递归:

。返回值,参数: TreeNode* ; root , key

。终止条件: nullptr--找不到删除的节点

。单层逻辑:

  1. 没找到删除的节点,遇空即返

  2. 叶子节点,直接删,返回nullptr

  3. 节点无左孩子,删了补右孩子

  4. 节点无右孩子,删了补左孩子

  5. 节点有俩孩子,删了补右孩子,左孩子放到右孩子最左节点做左孩子

补孩子:

  • 暂存一个节点放child

  • 删root

  • 返回retNode(暂存节点)给上一层

AC:

#include<iostream>
#include"TreeNode.h"
using namespace std;

TreeNode* deleteNode(TreeNode* root,int key){
    //1.
    if(root==nullptr)
        return root;
    if(root->val==key){
        //2.
        if(root->left==nullptr && root->right==nullptr){
            delete root;
            return nullptr;
        }
        //3.
        if(root->left==nullptr){
            auto retNode=root->right;
            delete root;
            return retNode;
        }
        //4.
        if(root->right==nullptr){
            auto retNode=root->left;
            delete root;
            return retNode;
        }
        //5.
        else{
            TreeNode* cur=root->right;
            TreeNode* tmp=root;
            while(cur->left){//cur->left!=nullptr
                cur=cur->left;
            }
            cur->left=root->left;
            root=root->right;
            delete tmp;
            return root;
        }
    }
    if(root->val>key) root->left=deleteNode(root->left,key);
    if(root->val<key) root->right=deleteNode(root->right,key);
    return root;
}

验证BST

98.验证二叉搜索树

  • 将树转为数组

AC:


标签:11,Task4,val,return,TreeNode,打卡,root,节点,left
From: https://www.cnblogs.com/Weenz-y/p/17854884.html

相关文章

  • 2023-11-24
    packageutils;importjava.awt.Component;importjava.awt.Toolkit;importjavax.swing.JFrame;publicclassGUITool{ staticToolkitkit=Toolkit.getDefaultToolkit(); //需要的设置该工具全部性质 publicstaticvoidsetAll(JFrameframe){ center(frame); fram......
  • C++11 多线程并发 互斥量、条件变量和信号量
    互斥量Classesmutex(C++11)providesbasicmutualexclusionfacility(class)timed_mutex(C++11)providesmutualexclusionfacilitywhichimplementslockingwithatimeout(class)recursive_mutex(C++11)providesmutualexclusionfacili......
  • 2023-11-24
    2023-11-24Vector底层结构和源码剖析、基本介绍1.Victor的定义说明publicclassvector<E>extendsAbstractList<E>implementsLIst<E>,RandomAccess,Cloneble,Serializable2.Victor底层也是个对象数组3.Victor是线程同步的,即线程安全4.开发中需要线程同步安全时,考虑使......
  • 11月24日
    在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:1.新的具体聊天室中发送的图片大小不得超过20M。2.新的具体聊天室中发送的文字长度不得超过100个字符。3.新的具体会员类可以发送图片信息和文本信息。4.新的具体会员类在发送文本信息时,可以......
  • 2023.11.24——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.JavaGUI2.会话跟踪技术明日计划:学习......
  • 20231124
    /*time:O(unknown)space:O(n*n)knowledge:树的直径step:dfs*2*/#include<bits/stdc++.h>usingnamespacestd;intn;vector<int>t[105];boolvis[105];ints,len;voiddfs(intx,intd){vis[x]=true;if(len<d){s=x;len......
  • 学习笔记11
    20211301学习笔记11教材知识点总结TCP/IP协议TCP:代表传输控制协议IP:代表互联网协议IPv4:32位IPv6:64位堆栈顶层:应用程序,用于登录远程主机ssh、用于交换电子邮件、用于web页面的http等应用程序需要可靠的数据传输网络中的数据流路径:IP主机和IP地址主......
  • [Luogu] P7911 [CSP-J 2021] 网络连接
    [CSP-J2021]网络连接-洛谷距离CSP2023还有\(**3**\)天题意及思路恶臭大模拟,按照题意模拟即可。有几个代码上的难点:当定义了一个scanf或者sscanf并且有一定的输入规则,那么如果读取到的字符串不符合定义的规则,那读入了几个变量就返回几个变量例如,如下代码定义了一个读......
  • [Luogu] P1164 小A点菜
    题目传送门一道动态规划,\(dp_{i, j}\)表示用前\(i\)个菜品花光\(j\)元的方法总数那么可以推出状态转移方程:\(if(j>a_i)\spacedp_{i,j}=dp_{i-1,j}+dp_{i-1,j-a_{i}}\)如果j比ai大,那么方案数就是不买\(dp_{i − 1, j}\)+买\(dp_{i − 1, j − a_i}\),其中如果买,那么......
  • [Luogu] P1114 “非常男女”计划
    https://www.luogu.com.cn/problem/P1114暴力,前缀和,稍加优化可以拿100,但是#1加强过后就AC不了了#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2e6;inta[maxn],n,f[maxn],ans,boy;intmain(){ cin>>n; for(inti=1;i<=n;i++) { scanf("%d",a......