首页 > 其他分享 >二叉查找树

二叉查找树

时间:2025-01-15 23:10:16浏览次数:1  
标签:target bst nullptr 二叉 查找 else root 节点

二叉查找树

对于任意一棵子树,其左子树比根节点小,右子树比根节点大。即:左 < 根 < 右

查找

比较目标值与根节点的大小关系,

  • 大就往右边找;
  • 小就往左边找;
  • 直到找到为止,如果到最后没有找到,则返回 nullptr
Node * BST::searchByIter(Node * bst, DataType target) {
    while (bst != nullptr) {
        //目标值比当前值大,往右走
        if (target > bst->data) {
            bst = bst->right;
        }
        //目标值比当前值小,往左走
        else if (target < bst->data) {
            bst = bst->left;
        }
        //不大不小,刚刚好
        else {
            return bst;
        }
    }
    
    //如果元素在树中,在前面循环执行的过程中就会返回,如果程序走到这里,就说明树中不存在该目标元素,返回空
    return nullptr;
}

获取最值

二叉查找树的特性是“左小右大”,所以找最大值直接向树的最右端找,找最小值直接去树的最左端找。

获取最大值:

DataType BST::getMax(Node * root) {
   	//寻找树最左端的值,即最小值
	while (root->right != nullptr) {
        root = root->right;
    }
    
    return root->data;
}

获取最小值:

DataType BST::getMin(Node * root) {
    while (root->left != nullptr) {
        root = root->left;
    }

    return root->data;
}

插入节点

  • 若节点为空:分配一个节点
  • 非空,比较大小,往对应的方向递归,直至为空;
void BST::insert(Node *& root, DataType target) {
    //为空,分配一个空间
    if (root == nullptr) {
		root = new Node();
        root->data = target;
        root->left = root->right = nullptr;
    }
    //比当前节点值小,向左找节点插入
    else if (target < root->data) {
        root->left = insert(root->left, target);
    }
    //比当前节点值大,向右找节点插入
    else if (target > root->data) {
        root->right = insert(root->right, target);
    }
    //else target存在,什么都不做
    return root;
}

删除节点

  • 节点为空:不可操作
  • 节点存在:
    • 要删除的节点是叶子节点:直接删除
    • 要删除的节点只有一个子节点:用该节点的子节点代替当前节点
    • 要删除的节点有两个子节点:找左子树中最大的节点或者右子树中最小的节点来代替当前要删除的节点
Node * BST::delete(Node *& root, DataType target) {
	if (root == nullptr) {
        cout << "Node is not exist!\n";
    }
    //大了
    else if (target > root->data) {
        
    }
    //小了
    else if (target < root->data) {
        
    }
	//找到了
    else {
        //左右子树都存在
        if (root->left != nullptr && root->right != nullptr) {
            
        }
        //当前节点是叶子节点
        else if (root->left == nullptr && root->right == nullptr) {
            
        }
        else if (root->left == nu)
    }
    
    return root;
}

标签:target,bst,nullptr,二叉,查找,else,root,节点
From: https://www.cnblogs.com/codels/p/18673885

相关文章

  • 代码随想录算法训练营第二十天 | 235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中
    235.二叉搜索树的最近公共祖先题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/文档讲解:https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%......
  • IDEA如何查找所有的文件和文件内容?
    前言大家好,我是小徐啊。我们在Java开发中,一般都是用IDEA来开发的,而在开发的过程中,难免需要查找某些文件,或者文件中的内容,这个时候就需要使用快捷键去查找了。那么,具体怎么查找呢?今天小徐就来介绍下。如何查找所有文件首先,我们需要打开IDEA,然后,快速按下两次Shift按键。然后,就......
  • 排序数组中查找数组的第一个和最后一个位置
    leetcode34之前的博客里面有写到关于二分查找的实现方法,这次这个题目也需要使用到二分查找,关于二分查找的实现可以参考博客:二分查找思路由于题目中给出的数组是递增排序的,那么我们会优先考虑到使用二分查找法,数组中可能出现多个重复的target,我们要查找的就是第一个和最......
  • 代码随想录:验证二叉搜索树
    二叉搜索树的中序遍历结果是一个递增的数组为了省空间可以用一个变量记录上一次的数字我一开始设置上一次的为null,结果c++中int为null时实际为0,所以要用最小值/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*......
  • day01 704. 二分查找&&27. 移除元素
    二分查找(search方法)publicintsearch(int[]nums,inttarget){intleft=0;intright=nums.length-1;intmid;while(left<=right){mid=(left+right)/2;if(nums[mid]==target){returnmid;}elseif(nums[mid]<target){left=mid+1;}else{right=mid-1;}}retur......
  • 电脑“减肥”利器:两款重复文件查找神器大揭秘
    前言:        随着电脑使用时间的增长,我们往往会不知不觉地积累大量重复的软件和文件。手动一一核对这些重复项,不仅耗时费力,还容易遗漏。今天,我要为大家推荐两款重复文件查找神器,它们能够轻松帮我们清理硬盘空间,让电脑“瘦身”更高效。EasyDuplicateFinder:重复文件......
  • 达梦误删数据,挖掘归档,查找误删数据的语句
    客户误删数据,没有开启慢日志,只有备份文件和归档日志,挖掘归档,分析删除数据影响的范围大小 1、概述可以使用DBMS_LOGMNR包对归档日志进行挖掘,重构出DDL和DML等操作,并通过获取的信息进行更深入的分析。相关限制说明如下:1)目前DBMS_LOGMNR只支持对归档日志进行分析,配置归......
  • 数据结构—《二叉树的定义与特性》
    目录1.二叉树的定义2.特殊的二叉树1)满二叉树2)完全二叉树3)二叉排序树。4)平衡二又树。5)正则二文树3.二叉树的性质4.二叉树的存储结构1)顺序存储结构2)链式存储结构1.二叉树的定义二叉树是一种特殊的树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大......
  • 数据结构之链式二叉树
    前言:前面我们学习了树相关的概念及堆的实现,今天来看看二叉树的实现。正式实现二叉树前,我们先了解一些基础知识。对于二叉树基础知识不清楚的可以观看数据结构------树这篇文章,回顾一下知识,有助于理解二叉树。二叉树的遍历方式都有哪些呢?.前序遍历:按照根节点,左节点,右节......
  • 查找总价格为目标值的两个商品、三数之和--------双指针的方法解决问题
    OJ题:LCR179.查找总价格为目标值的两个商品-力扣(LeetCode)OJ题:15.三数之和-力扣(LeetCode)一、 查找总价格为目标值的两个商品(俩数之和)1.题目描述购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回......