数据结构|二叉搜索树

本文详细介绍了二叉搜索树的定义、性质、结点结构、创建过程、查找、插入和删除操作,并通过示例展示了Java代码实现。二叉搜索树因其特性,常用于快速查找,中序遍历可得到有序数组。
摘要由CSDN通过智能技术生成

二叉搜索树

1 定义

二叉搜索树,也称为二叉查找树或者二叉排序树。假设节点node是二叉搜索树中的某个结点,结点node包含左右指针和数据值x,如果node结点的左结点上存在left结点(数据值为y),则y值小于x值,如果node结点的右结点上存在right结点(数据值为z),则z值大于x值。因为这个特性,它经常用于二分查找。

2 性质
  • 若树中任意结点的左子树不为空,则左子树上的所有结点的值均小于该结点的值;
  • 若树中任意结点的右子树不为空,则右子树上的所有结点的值均大于该结点的值;
  • 树中任意结点的左、右子树都为二叉搜索树;
3 结点结构

二叉搜索树的结点结构跟普通二叉树结点一样,拥有左孩子的指针,右孩子的指针以及数据域。可以用下面的图来表示:
结点结构
Java代码定义为:

class TreeNode<T> {
   
    TreeNode<T> leftNode;
    TreeNode<T> rightNode;
    T nodeValue;
    
    public TreeNode(T object) {
   
        this.nodeValue = object;
    }
}
4 创建二叉搜索树

首先给出一个无序的数组int[] num = {11,10,9,22,13,30,17},我们以这个无序数组为例建立一个二叉搜索树:
第一步:i = 0,num[0]=11,二叉搜索树为空树,则根节点为11;
1
第二步:i = 1,num[1]=10,与根结点11比较,小于根结点且根结点的左子树为空,则作为根结点的左结点;
2
第三步:i = 2, num[2]=9,小于根结点11且左结点不为空,继续与根结点的左结点10比较,小于10且该结点的左结点为空,则作为10的左结点;
3
第四步:i = 3,num[3]=22,大于根节点11且根结点的右结点为空,则作为根结点的右结点;
4
第五步:i = 4,num[4]=13,大于根结点11且根结点的右结点不为空,小于根结点的右结点,且其左结点为空,则作为根结点的右结点的左结点;
5
第六步:i = 5,num[5]= 30,大于根节点11且根结点的右结点不为空,大于根结点的右结点,且其右结点为空,则作为根结点的右结点的右结点;
6
第七步:i = 6,num[6]=17,大于根结点11且根结点的右结点不为空,小于根结点的右结点,且其左结点不为空,大于其左结点且其左结点的右结点为空,则作为根结点的右结点的左结点的右结点;
7
则其最后的二叉树为:
0
注意:二叉搜索树的中序遍历就是一个排序的数组。

用Java代码实现整个插入的过程:

    /**
     * 二叉搜索树插入
     * @param value
     */
    public void insert(Integer value) {
   
        TreeNode<Integer> node = new TreeNode<Integer>(value);
        if (rootNode == null) {
   
            rootNode = node; // 赋值根结点
            return;
        }
        TreeNode<Integer> currentNode = rootNode;
        TreeNode<Integer> parentNode = rootNode;
        boolean isLeftNode = false;
        while (currentNode != null) {
   
            parentNode = currentNode;
            if ((int)value > (int)parentNode.nodeValue) {
   
                currentNode = currentNode.rightNode; // 大于当前节点的值则往右子树查找
                isLeftNode = false;
            } else if ((int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值