java tree类子项的添加和删除_Java数据结构与算法分析 | 二叉查找树(BST)

GitHub源码分享

1. 二叉查找树(Binary Search Tree)

二叉查找树又叫二叉排序树(Binary Sort Tree),或叫二叉搜索树,简称BST。BST是一种节点值之间有次序的二叉树。其特性是:若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

若任意节点的右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;

任意节点的左、右子树也分别为二叉查找树;

2947c1750ef62eccc26a8a95bf73fea4.png

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低,为$O(logN)$。用大$O$符号表示的时间复杂度:算法平均最差空间$O(N)$$O(N)$

搜索$O(logN)$$O(N)$

插入$O(logN)$$O(N)$

删除$O(logN)$$O(N)$

2. BST的实现

二叉查找树要求所有的节点元素都能够排序,所以我们的Node节点类需要实现Comparable接口,树中的两个元素可以使用compareTo方法进行比较。

我们节点中元素的类型为int型,所以该接口泛型为Comparable,下面是具体实现:

2.1 节点类element 为数据元素

left 为左子节点

right 为右子节点class Node implements Comparable {

private final int element; // 数据元素

private Node left; // 左子树

private Node right; // 右子树

private Node(Integer element) {

this.element = element;

}

@Override

public int compareTo(Integer o) {

return o.compareTo(element);

}

}

2.2 二叉查找树类root 为树根,所有的操作均始于此

后面会在该类中增加其他方法,如添加、查找、删除等class BinarySearchTree {

private Node root; // 树根

}

3. 插入节点

向二叉查找树中插入的节点总是叶子节点,插入过程如下:若root为空,则将插入节点设为root

当前元素与插入元素通过compareTo进行比较,若插入元素值小,并且左子节点left为空,则插入至当前节点左子节点;否则继续递归

若插入元素值大,且右子节点right为空,则插入至当前节点右子节点;否则继续递归。

若插入元素等于当前节点元素,则插入失败。注:也可以将其插入到右子节点,我这里为了方便直接放弃插入。

具体实现:

在BinarySearchTree类中添加两个方法:public boolean add(int element) 为公开方法

private boolean add(Node node, int element)为私有方法,内部递归使用// 添加元素

public boolean add(int element) {

if (root == null) {

root = new Node(element);

return true;

}

return add(root, element);

}

// 添加元素(递归)

private boolean add(Node node, int element) {

if (node.compareTo(element) < 0) {

if (node.left == null) {

node.left = new Node(element);

return true;

} else {

return add(node.left, element);

}

} else if (node.compareTo(element) > 0) {

if (node.right == null) {

node.right = new Node(element);

return true;

} else {

return add(node.right, element);

}

} else {

return false;

}

}

4. 查找节点

通过二叉查找树查找元素,其过程如下:若root为空,则查找失败

将当前元素与目标元素对比,若相等则查找成功。

若不相等,则继续递归查找:若目标值小于当前节点值,则查找左子树;否则,查找右子树。

具体实现:

在BinarySearchTree类中添加两个方法:public Node find(int element) 为公开方法

private Node find(Node node, int element)为私有方法,内部递归使用// 查找元素

public Node find(int element) {

if (root == null) {

return null;

}

return find(root, element);

}

// 查询元素(递归)

private Node find(Node node, int element) {

if (node == null) {

return null;

}

int compareResult = node.compareTo(elem

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值