个人博客传送门

一、别名

二叉查找树, 有序二叉树, 排序二叉树, Binary Search Tree

二、特征

  • 左子树的悉数节点的值均小于根节点
  • 右子树下悉数节点的值均大于更节点
  • 悉数节点的值都不相同
  • 任意节点的左子树和右子树也都是BST

数据结构(一),  BST 二叉查找树

三、节点结gitee

    public static class Node {
// 数据区
private int data;
// 左节点
priv算法的时刻复杂度取决于ate Node leftgithub官网;
// 右节javascript
private Node right;
}

四、完结概述

1. 查找

  • 先查找算法的时刻复杂度是指什么根节点,
  • < 根, 则找左子树;
  • > 根, 则找右子树;
  • = 根, 则找到返回;

算法时刻复杂度 关于 n 个节点的树

  • 最优 f(n) = 需求查找的次数 = 二叉树的层数 ~= Ogithub永久回家地址(logn)github下载

数据结构(一),  BST 二叉查找树

  • 最差 f(n) = 需求查找的次数 = 二叉树的层数 = n = O(n)

数据结构(一),  BST 二叉查找树

    public Nogithub官网de search(int num) {
return doSegit教程arch(root, num);
}
private算法设计与剖析 Node doSearch(Node root, int num) {
if (root == null) {
return nulgithub打不开l;
}
if (root.data == num) {
return root;
} else if (root.data > num) {
return doSearch(root.left, num);
}giti else if (root.data < nugithub怎样下载文件m) {
return doSe算法的有穷性是指arch(root.right, num);
}
return null;
}

2. 刺进

  • 比对根节点, 小github官网于就往左节点比对, 大于就往右节点比对
  • 直到需求比对的节点为空, 而这个空就是你需求刺进的方位

算法时刻复杂度:

  • 最优 f(n) = 需求比对的次数 = 二叉树的层数 ~= O(logn)

数据结构(一),  BST 二叉查找树

  • 最差 f(n) = 需求查找的次数 = 二叉树的层数 = n = O(n)

数据结构(一),  BST 二叉查找树

    public void insert(int num) {
root = doInsert(root, num);
}
private Node doInsert(Node parent, int numgithub) {
if (github是干什么的parent ==github中文官网网页 null) {
paregithub敞开私库nt =算法导论 new Node(num);
} else if (num &gtjava怎样读; parengithub永久回家地址t.data) {
parent.right = doInsert(parent.right, num);
} else if (num &lgithub敞开私库t; parent.data) {
parent.left = doInsert(parent.left, num);
}
return parent;
}

3. 删去

  • 先查找到方针节点
  • 若: 方针左子树为空, 则, 用方针右子树根节点替换方针
  • 若: 方针右子树为空, 则, 用方针左子树根节点替换方针
  • 若: 都不为空, 则, 选取左子树值最大节点或许github是干什么的右子树最小节点替换方针, 并, 递归删去替换政算法剖析的意图是策的节点
    public void remove(injava模拟器t num) {
root = doRemove(root, num);
}
private Node doRemove(Node parent, int num) {算法剖析的意图是
if (parent == null) {
return null;
}
if (num > parent.data) {
parent.right =github中文社区 doRemove(parent算法的特性.right, num);
} else if (num < pare算法的有穷性是指nt.data) {
parent.left = doRemove(pgithub怎样下载文件arent.left, num);
}
// 找算法导论出左子树最大的值或许右子giti树最小的值替换, 这儿选择前者来完结
else if (parent.left != null && parent.rightgit教程 != null) {
// 找到左子树最大值替换
parent.da算法的时刻复杂度取决于ta = findMax(parent.left).data;
// 删去左子树中用于替换的节点
pa算法的五个特性rent.left = doRemovgithub永久回家地址e(parent.left, parentgithub打不开.data);
}
// 左子github敞开私库树为空, 直接用右子树根节点替换被删去的节点
else if (paregithub官网nt.left == null) {
parent = parent.right;
}
// 右子树为空, 直接用左子树根节点替换被删去的节点Java
else igithubf (parent.right == null) {
parent = parent.left;
}
return parent;
}
private Node findMax(Node node) {
if (node == null)java言语 {
return node;
}
while (node.rgiti轮胎是什么品牌ighgithub是干什么的t != null) {
node = node.riggithub敞开私库ht;
}
return node;giti
}

算法复杂度:

  • 最优 f(n) = 需求比对的次数 = 查找到方针比对次数 + 递归查找替换方针的节点的替换节点的比对次数 = 二叉树层数 = O(logn)

数据结构(一),  BST 二叉查找树

  • 最差 f(n)算法设计与剖析 = … = 二叉树层数 = n = O(n)

数据结构(一),  BST 二叉查找树

具体完结

就一个BinarySearchTree.java文件搞定, 里边还附有main()函数测验功用, 可直接运转github传送门github直播平台永久回家