数据结构,二叉树搜索树(一)

简介: 本文讲解:二叉搜索树的遍历方式之查找节点。

1. 二叉搜索树的概念

二叉搜索树又称为二叉排序树,它的特点为左子树往后的所有结点都比根节点小,右子树往后的所有结点都比根节点大。根据下图来理解:

image.gif编辑

通过上图我们可以观察到,以20为根节点时左侧的所有节点都比20要小,右侧的所有节点都要比20要大。当以20的左子树18、右子树31作为根节点时也是左边节点比根节点小,右边节点比根节点大。

那么以这种结构组成的二叉树,我们就叫做二叉搜索树。因此我们能得出这些性质:

    • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
    • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
    • 它的左右子树也分别为二叉搜索树

    首先我们要知道,一个节点是由左子树,值,右子树组成,通常左子树用 left 表示,值用 val 表示,右子树用right表示。把三个部分综合起来这样就形成了一个节点,树的根节点用 root 表示因此我们可以定义一个静态内部类 TreeNode 来搭建这个节点:

    //节点结构
        static class TreeNode {
            public TreeNode left;//左子树
            public TreeNode right;//右子树
            public int val;//值
            public TreeNode(int val) {
                this.val = val;//构造方法为成员变量赋值
            }
        }
        public TreeNode root;//根节点

    image.gif

    这样节点的搭建就完成了,我们可以看到这个节点内包含的 left、val、right 这三个代表量。 下面,我们就来讲解二叉搜索树的操作:查找节点、插入节点、删除节点


    2. 二叉搜索树的操作

    2.1 查找节点

    查找二叉树的节点,我们根据二叉搜索树的性质下可以列出以下几个条件,

      1. 若根节点不为空
      2. 根节点等于要查找的节点,返回根节点
      3. 根节点大于要查找的节点,在根节点的左子树查找
      4. 根节点小于要查找的节点,在根节点的右子树查找
      5. 否则,返回null

      (1).根节点为空

      根节点为空代表这个树是不存在的,因此我们直接返回null即可:

      if(root == null) {
              return null;
          }

      image.gif


      (2).根节点等于要查找的节点

      根节点等于要查找的节点我们直接返回根节点即可,这种情况相当于一下子就找到了。因此它的时间复杂度为O(1)

      image.gif编辑

      因此,我们可以写出这样的代码:

      if(root.val == key) {
              return root;
          }

      image.gif

      root.valroot 节点值,key 是我们要查找的数据。注意,我们写代码是一步一步来写的,能实现当前的模块,就写当前的代码。最后综合起来并进行修改这样就能写出一段完整的代码。


      (3).根节点大于要查找的节点,在根节点的左子树查找

      根节点大于要查找的节点,为了满足二叉搜索树的左子树小于根节点的性质,我们要在根节点的左子树进行查找。

      image.gif编辑

      因此,我们可以写出以下代码:

      if(root.val > key) {
              root = root.left;
          }

      image.gif

      如果root.val大于我们要查找的值key,使根节点变为root的left节点。


      (4).根节点小于要查找的节点

      根节点小于要查找的节点,为了满足二叉搜索树的右子树大于根节点的性质,在根节点的右子树查找。

      image.gif编辑

      因此,我们可以写出以下代码:

      if(root.val < key) {
              root = root.right;
          }

      image.gif

      把以上所有的代码综合起来,这样我们就能写出查找结点的方法。我把查找的结点的方法名命为 findNode,方法内的代码根据上方代码进行修改而成。

      方法内的流程为:1.判断节点是否为空,为空则返回null。2.在根节点不为空的情况下,判断要查找的节点是否为根节点是则返回根节点,否则判断该节点在根节点的左子树还是右子树,是左子树就把根节点置为左子树,是右子树就把根节点置为右子树。3.没有该节点,返回null。

      public class BinarySearchTree {
          //节点结构
          static class TreeNode {
              public TreeNode left;//左子树
              public TreeNode right;//右子树
              public int val;//值
              public TreeNode(int val) {
                  this.val = val;//构造方法获取val的值
              }
          }
          //根节点
          public TreeNode root;
          //查找节点
          public TreeNode findNode(int key) {
              TreeNode node = root; //使node为根节点的一个代替
              if (node == null) { //根节点不为空
                  return null;
              }
              while (node != null) { //根节点不为空
                  if (node.val == key) { 
                      return node;//找到根节点就返回node
                  }else if (node.val > key) {
                      node = node.left;//根节点的值大于查找的值
                  }else {
                      node = node.right;//根节点的值小于查找的值
                  }
              }
              return null;//没有该节点返回null
          }
      }

      image.gif

      注意,我们直接使用根节点 root 进行操作的话会改变 root 的位置,这样在其他方法使用 root 结点时不能从最初的根节点(最顶层的根据)进行操作,因此我们可以创建一个代替根节点的代替值 node来进行操作,这样无论如何 root 始终是在最初的根节点。

      相关文章
      |
      18天前
      |
      存储 搜索推荐 算法
      【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
      本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
      60 16
      |
      18天前
      |
      C语言
      【数据结构】二叉树(c语言)(附源码)
      本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
      67 8
      |
      1月前
      |
      存储 算法 关系型数据库
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
      22 0
      数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
      |
      1月前
      |
      存储 算法 搜索推荐
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
      25 0
      数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
      |
      1月前
      |
      Java C++
      【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
      本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
      30 0
      |
      1月前
      |
      存储 算法
      探索数据结构:分支的世界之二叉树与堆
      探索数据结构:分支的世界之二叉树与堆
      |
      1月前
      |
      存储 算法
      数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
      这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
      25 0
      |
      19天前
      |
      C语言
      【数据结构】栈和队列(c语言实现)(附源码)
      本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
      98 9
      |
      10天前
      |
      存储 算法
      非递归实现后序遍历时,如何避免栈溢出?
      后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
      19 1

      热门文章

      最新文章

      下一篇
      无影云桌面