数据结构|数据结构 Java数据结构 --- 二叉搜索树


文章目录

  • 二叉搜索树
  • 1. 二叉搜索树的概念
  • 2. 二叉树操作 - 查找
  • 3. 二叉树操作 - 插入
  • 4. 二叉树操作 - 删除
  • 5. 性能分析

二叉搜索树 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:
  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树
数据结构|数据结构 Java数据结构 --- 二叉搜索树
文章图片

2. 二叉树操作 - 查找 数据结构|数据结构 Java数据结构 --- 二叉搜索树
文章图片

代码实现:
public Node search(int val){ while (root != null){ if(val > root.val){// val>root.val 在右子树查找 root = root.right; }else if(val < root.val){// val

3. 二叉树操作 - 插入 【数据结构|数据结构 Java数据结构 --- 二叉搜索树】数据结构|数据结构 Java数据结构 --- 二叉搜索树
文章图片

代码实现:
public boolean insert(int val) { // 当为空树的时候 直接插入val if(root == null) { root = new Node(val); return true; } // 当不为空时的时候,进行判断 Node parent = null; Node child = root; while (child != null){ // val 较大 寻找右子树 if(child.val < val){ parent = child; child = child.right; }else {//val 较小 寻找左子树 parent = child; child = child.left; } } // 这里 parent的左子树或右子树就可以进行插入,此时进行判断. if(parent.val < val){ parent.right = new Node(val); }else { parent.left = new Node(val); } return true; }

4. 二叉树操作 - 删除 数据结构|数据结构 Java数据结构 --- 二叉搜索树
文章图片

数据结构|数据结构 Java数据结构 --- 二叉搜索树
文章图片

public void remove(int key) { Node cur = root; Node parent = null; while (cur != null){ if(cur.val == key){ //找到要删除的节点 进行删除 removeNode(cur,parent); }else if(cur.val < key){ parent = cur; cur = cur.right; }else { parent = cur; cur = cur.left; } } } public void removeNode(Node cur,Node parent){ if(cur.left == null){ // 情况一 if(cur == root){ root = cur.right; }else if(cur == parent.left){ parent.left = cur.right; }else { parent.right = cur.right; } }else if(cur.right == null){ // 情况二 if(cur == root){ root = cur.left; }else if(cur == parent.right){ parent.right = cur.left; }else { parent.left = cur.left; } }else { // 情况三 Node targetParent = cur; Node target = cur.right; while(target.left != null){ targetParent = target; target = target.left; } cur.val = target.val; if(target == targetParent.left){ targetParent.left = target.right; }else { targetParent.right = target.right; } } }

5. 性能分析 插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树
数据结构|数据结构 Java数据结构 --- 二叉搜索树
文章图片

最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:数据结构|数据结构 Java数据结构 --- 二叉搜索树
文章图片

最差情况下,二叉搜索树退化为单支树,其平均比较次数为:
数据结构|数据结构 Java数据结构 --- 二叉搜索树
文章图片

    推荐阅读