二分搜索树

本文详细介绍了二分搜索树的基本概念、插入、查找和遍历等核心操作,并探讨了其在查找表应用中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分搜索树

二分搜索树一般用于查找表(字典)的数据结构,即key-value形成的表结构。查找表对于普通数组,我们查找元素的复杂度是O(n),插入元素的复杂度也是O(n)(遍历查找表看是否有这个key),删除元素的复杂度也是O(n)。对于顺序数组,我们查找元素通过二分查找可以达到O(logn),而插入元素的复杂度是O(n),删除元素也是O(n)。而对于二叉搜索树,查找插入和删除元素的复杂度都是O(logn)。
二叉搜索树需要满足这样一个条件,每个节点的键值大于左孩子,小于右孩子。以左右孩子为根的子数仍然是二叉搜索树,一个祖先节点的左子孙节点都比祖先节点小,右子孙节点都比祖先节点大。我们知道堆的二叉树必须是完全二叉树,而对于二叉搜索树来说没有这个限制,同时也意味者我们不合适使用数组来保存二叉搜索树,我们使用node及其两个指针left和right。我们的二叉搜索树上的节点值是key的值,value的值没有直接表示出来。

二分搜索树的插入

我们首先将待插入元素与根元素做比较,如果比根元素大,则与根元素的右子树比较,直到为空,才插入元素。那么如果相等呢,我们会使用新数据代替旧数据(key相同,当时value不同)

   //node在调用时传入根节点
   //返回插入新节点后的二分搜索数的根
   function insert(node, key, value){
      if(node == null){
         //节点数量
         count ++;
         return new Node(key, value);
      }
      if(node.key == key){
          node.key = value;
      } else if(key < node.key){
          node.left = insert(node.left, key, value);
      } else{
          node.right = insert(node.right, key, value);
      }
      return node;
   }

有了插入节点,我们就能建立一个二分搜索树,进而我们就可以查找节点。

二分搜索树的查找

查找操作是我们最关心的操作,和插入节点类似,不同的是如果查找到空节点,查找就失败。

   function contain(){
      //和search方法类似,contain只返回true或者false
   }
   function search(node, key){
      if(node == null){
         return null;
      }
      if(node.key == key){
         return node.value;
      } else if(key < node.key){
         search(node.left, key);
      } else {
         search(node.right, key);
      }
   }

二分搜索树的遍历(深度优先)

深度优先分成前序遍历,中序遍历和后序遍历,我们把每个节点看成有三个方向,分别代表前序方向,中序方向和后序方向
前序遍历从根节点开始,先访问根节点的前序方向,因为是前序遍历,所以将它打印出来,再访问左子节点的前序方向,如果为空则访问左子节点的中序方向,中序方向不需要做任何操作,接着访问后序方向。其他两个遍历也是一样。

   //使用递归
   //preOrder(root)
   function preOrder(node){
      if(node != null){
          //可以做任意操作to do 
          console.log(node.key);
          preOrder(node.left);
          preOrder(node.right);   
      }
   }
   function inOrder(node){
      if(node != null){
          inOrder(node.left);
          console.log(node.key);
          inOrder(node.right);   
      }
   }

比如我们可以使用后序遍历来对整个二分查找树就行释放,只需要把console.log改成destroy函数即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值