数据结构------二叉查找树

目录

什么是二叉查找树?

应用场景

二叉查找树参考实现

基本结构

插入结点过程

插入结点实现

初始化BST

查找结点过程

查找结点实现

查找最大值实现

查找最小值实现


什么是二叉查找树?

二叉查找树(Binary Search Tree),也称二叉排序树(Binary Sort Tree),简称BST。它是一种特殊的二叉树,具备以下特点:

  • 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  • 左、右子树也分别为二叉排序树;

应用场景

叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛。

例如:在文件系统、数据库系统的索引等应用场景会采用这种数据结构进行高效率的排序与检索操作。

二叉查找树参考实现

基本结构

java 复制代码
public class BinarySortTree {
	// 根节点
	TreeNode root;

	// 树节点内部类
	static class TreeNode {
		Integer data; // 节点数据
		TreeNode left; // 左子节点
		TreeNode right; // 右子节点
		TreeNode parent; // 父节点

		// 无参构造方法
		public TreeNode() {}

		// 有参构造方法
		public TreeNode(Integer val) {
			this.data = val;
		}
	}
}

插入结点过程

假设有无序数组:8、3、 10 、1、 6、 14、4、7、13,需要按照二叉查找树的方式进行存储。

结点插入过程如下:

第一步:插入 8 作为根结点;

第二步:插入 3 ,与根结点 8 进行比较,发现比8小,且根结点没有左孩子,则将 3 插入到 8 的左孩子;

第三步:插入10,首先与根结点比较,发现比 8 大,则要将 10 插入根结点的右子树;根结点 8 的右子树为空,则将 10 作为 8 的右孩子;

插入 1,首先与根结点比较,比根结点小,则应插入根结点的左子树。再与根结点的左孩子 3 比较,发现比 3 还小,则应插入 3 的左孩子。

第五步:插入 6,先与根结点8比较,小于 8,向左走;再与 3 比较,大于 3,向右走,没有结点,则将6 作为3的右孩子;

依此类推,二叉查找树最终完成初始化。

插入结点实现

java 复制代码
// 插入新节点
public void insert(TreeNode newNode) {
    TreeNode currentNode = this.root; // 查找过程中的当前节点
    TreeNode parent = null;  // 新节点的父节点

    // 查找新节点的插入位置
    while (currentNode != null) {
        parent = currentNode;
        if (newNode.data < currentNode.data) {
            currentNode = currentNode.left;
        }else {
            currentNode = currentNode.right;
        }
    }

    // 设置新节点的父节点
    newNode.parent = parent;

    // 通过父节点的左右子节点属性,保存新节点
    if (parent == null) {
        this.root = newNode;
    } else {
        if (newNode.data < parent.data) {
            parent.left = newNode;
        }else {
            parent.right = newNode;
        }
    }
}

初始化BST

java 复制代码
public void init(Integer[] numberArray) {
    for (int i = 0; i < numberArray.length; i++) {
        insert(new TreeNode(numberArray[i]));
    }
}
java 复制代码
BinarySortTree bst = new BinarySortTree();
bst.init(new Integer[] { 8, 3, 10, 1, 6, 14, 4, 7, 13 });
bst.inOrder(bst.root);
  • 数组中元素的原始顺序:8、3、10 、1、6、14、4、7、13
  • 二叉排序树的中序遍历:1、3、4、6、7、8、10、13、14

查找结点过程

二叉排序树的查找操作基于二分查找,

例如:在下面这颗二叉查找树中,查找值为13的结点的过程如下:

  • 第一步:访问根结点 8
  • 第二步:根据二叉排序树的左子树均比根结点小,右子树均比根结点大的性质, 13 > 8,因此值为13的结点可能在根结点 8 的右子树当中,我们查看根结点的右子结点 10
  • 第三步:与第二步相似, 13 > 10,因此查看结点 10的右孩子 14
  • 第四步:根据二叉排序树的左子树均比根结点小,右子树均比根结点大的性质, 13 < 14,因此查看 14的左孩子 13,找到目标结点

查找结点实现

java 复制代码
private TreeNode search(TreeNode currentNode,Integer data) {
    if (currentNode == null) {
        return currentNode;
    }

    if (data < currentNode.data) {
        return search(currentNode.left, data);
    } else if (data > currentNode.data) {
        return search(currentNode.right, data);
    } else {
        return currentNode;
    }
}


public TreeNode find(Integer data) {
    TreeNode resultNode = search(this.root, data);
    return resultNode;
}

查找最大值实现

java 复制代码
public TreeNode findMax(TreeNode currentNode) {
    if(currentNode == null) {
        return currentNode;
    }

    TreeNode parent = null;  // 新节点的父节点

    // 查找新节点的插入位置
    while (currentNode != null) {
        parent = currentNode;
        currentNode = currentNode.right;
    }
    return parent;
}

查找最小值实现

java 复制代码
// 查找最小值
public TreeNode findMin(TreeNode currentNode)  {
    if(currentNode == null) {
        return currentNode;
    }

    TreeNode parent = null;  // 新节点的父节点

    // 查找新节点的插入位置
    while (currentNode != null) {
        parent = currentNode;
        currentNode = currentNode.left;
    }
    return parent;
}
相关推荐
Live&&learn5 小时前
算法训练-数据结构
数据结构·算法·leetcode
胡萝卜3.06 小时前
掌握C++ map:高效键值对操作指南
开发语言·数据结构·c++·人工智能·map
风筝在晴天搁浅7 小时前
代码随想录 509.斐波那契数
数据结构·算法
落落落sss7 小时前
java实现排序
java·数据结构·算法
fei_sun8 小时前
【数据结构】2018年真题
数据结构
SundayBear8 小时前
C语言复杂类型声明完全解析:从右左原则到工程实践
c语言·开发语言·数据结构·嵌入式
立志成为大牛的小牛10 小时前
数据结构——四十四、平衡二叉树的删除操作(王道408)
数据结构·学习·程序人生·考研·算法
hweiyu0013 小时前
数据结构:数组
数据结构·算法
无限进步_13 小时前
C语言单向链表实现详解:从基础操作到完整测试
c语言·开发语言·数据结构·c++·算法·链表·visual studio
初夏睡觉13 小时前
循环比赛日程表 题解
数据结构·c++·算法