美文网首页
算法笔记02-查找#1

算法笔记02-查找#1

作者: areece | 来源:发表于2020-03-30 07:43 被阅读0次

首先查找与插入都是放在一起说的。而且顺序查找这种低级的事情,是上不了台面的,虽然很多时候,顺序查找也能够解决问题。从编程的原则上讲,如果数据规模不大,用顺序查找(数组或者链表)问题不大,而且也不用那么伤脑筋。

二叉查找树

所有的二叉树,查找算法都是一致的,虽然有先根、中根与后根的区别,但是都简单到不行,区别在于插入时的性能与复杂度,还有更可怕的删除时的性能与复杂度。

基本二叉树

基本二叉树的插入比较简单,如果比当前节点小,就在左子树上插入,否则在右子树上插入。代码将更新父节点简化了,不过不影响逻辑。

/* root is a reference */
void insertNode(root, node) {
  if (root == null) {
    root = node;
  }
  
  if (node == node) return; /* duplicate */
  
  if (node < node) insertNode(node.left, node)
  else insertNode(node.right, node);
}

删除的逻辑就比较复杂一些,如果删除的叶子节点,删了也就删除了。如果删除只有一个子树(左右子树有一个为空),把子树的根节点拿来代替当前节点就可以了。上面两种情况其实都是对应了一种基本概念,我们要删除的是某个子树上的最大值或者最小值:没有左子树的时候,删除的是最小值,没有右子树时删除的最小值。

基于上面的删除最值的操作,删除中间节点的删除逻辑上就非常简单了:我们拿左子树中的最大值或者右子树中的最小值来代替当前节点就可以了。

/* 
  删除一个节点,并且返回被删除的节点,其中x是根节点,返回删除最小节点 
  之后的根节点;
*/
func getMin(Node x) {
    if (x.left != null) return getMin(x.left);
    return x;
}

func deleteMin(Node x) {
  if (x.left != null) {
    x.left = deleteMin(x, x.left);
    return x;
  }
  return x.right;
}

func getMax(Node x) {
   if (x.right != null) return getMax(x.right);
   return x;
}

Node deleteMax(Node x) {
  if (node.right != null) {
    x.right = deleteMax(x.right);
    return x;
  }
  return x.right;
}

func deleteNode(Node parent, Node x) {
    /* 在左子树或者右子树中,找到前续或者后继 */
    Node y = deleteMinOrMax(x);
    y.left = x.left;
    y.right = x.right;
    
   if (parent) {
      if(parent->left == x)  parent->left = y;
      else parent->right = y;
   } else {
      root = y;
  }
};

相关文章

  • 算法笔记02-查找#1

    首先查找与插入都是放在一起说的。而且顺序查找这种低级的事情,是上不了台面的,虽然很多时候,顺序查找也能够解决问题。...

  • 数据结构与算法笔记day12:二分查找(上)

    二分查找(Binary Search)算法,也叫折半查找算法,是一种针对有序数据集合的查找算法。 1无...

  • 算法 查找 笔记

    查找就是根据给定的某个值,在查找表中确定一个其关键字等于给给定值的数据元素(或记录)。 查找表是由同一类型的数据元...

  • PHP经典算法题

    PHP学习之路---算法题 1.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象...

  • 算法02-递归

    算法02-递归 一、定义 1、思想 程序调用自身的编程技巧称为递归(recursion)。 递归做为一种算法在程序...

  • 《算法图解》读书笔记

    《算法图解》读书笔记 二分查找 算法实现: ​ 在有序列表中查找一个数,每次都与有序列表的中间数比较,如果不同...

  • 算法笔记》3.2小节——入门模拟->查找元素

    @[TOC] Contest100000576 - 《算法笔记》3.2小节——入门模拟->查找元素 1932 Pr...

  • 二分查找

    学习极客时间的数据结构与算法之美的专栏,记录笔记。 1 二分查找应用场景的局限性 (1)二分查找依赖的是顺序表结构...

  • 数据结构实验——折半查找

    前子表查找:high=mid-1;后子表查找:low=mid+1;算法分析:1.确定查找有序序列a,置查找区间初值...

  • 刷题笔记

    算法思想 一、二分查找 1. 算法思想 算法详解 算法细节 一定要看二分查找细节.md 实现时需要注意以下细节: ...

网友评论

      本文标题:算法笔记02-查找#1

      本文链接:https://www.haomeiwen.com/subject/tnazyhtx.html