二叉搜索树(创建,插入,删除):基础篇,适合新手观看。

1.1 二叉搜索树的插入

二叉搜索树的概念相信大家都很清楚,无非就是左小右大
创建二叉搜索树,其实就是多次调用二叉搜索树的插入方法,所以首先我们来讲讲如何插入节点到二叉搜索树里,假设一颗二叉搜索树如下,现在要插入值为4这个节点,于是我们应该要与二叉树中每一个节点比较大小,然后决定到左,右哪一个子树里去,首先比较根节点,于是应该去根节点的左子树里寻找合适的位置,然后再与5这个节点比较,于是应该去5这个节点的左子树里寻找合适的位置,再与3比较,再到3的右子树里去,但3的右子树是空(null),所以这就是我们要找的位置,此时把4插进去。通过这个我们也能得到一个结论,我们找到的插入节点的位置肯定是null,也就是不会抢占其他节点的位置。

在这里插入图片描述

1.2 java代码实现:

首先我们定义一个二叉搜索树类:

public class AVLTree {
    private AVLTree left;//指向当前节点的左儿子
    private AVLTree right;//指向当前节点的右儿子
    int Data;//节点的值域为整型

    public AVLTree(int Data){
        this.Data=Data;
    }

插入节点代码实现

    public  static AVLTree  InsertNode(AVLTree root,int Data){
            if(root==null){//当前位置是null表示找到合适位置了
                AVLTree node = new AVLTree(Data);
                root = node;
            }
            else {
                if (Data > root.Data) {
                    root.right = InsertNode(root.right, Data);
                } else if (Data <= root.Data) {
                    root.left = InsertNode(root.left, Data);
                }
            }
            return root;
    }

这里采用的是递归实现,之前说过找到插入节点的位置肯定是null,于是才会有if(root==null)这个判断条件,这里之所以写成root.left/right = InsertNode(…),是因为我们要兼顾if(root=null)里的语句,这里面的语句其实就是创建一个新节点对象,赋予我们传入的值,也就是插入的节点,想一想如果没有root.left/right = InsertNode(…),我们创建的节点位置是找到了,但是并不知道谁是它的父母,于是我们需要在上一次递归的时候记下它的父母是谁。


2.1 二叉搜索树的删除

删除主要是分为三种情况,第一种,删除的节点是叶子节点,第二种,删除的节点有一个左儿子或者右儿子,第三种,删除的节点有左儿子和右儿子两个节点
什么时候,我们删除节点后需要找一个背锅侠来顶位?
如果删除的节点属于第三种情况时,我们就需要找个背锅侠来顶位,我们可以选择找出当前删除节点的左子树中最大的一个节点或者右子树中最小的一个节点来顶位,设当前删除节点是nowN,它的左子树中最大的节点是Maxleft,那么肯定满足:
nowN左子树<Maxleft<nowN<nowN右子树,满足左小右大,所以找它来顶锅准没错。
那么有聪明的朋友肯定会问了,如果背锅侠从原来位置移动到背锅位置的话,那它原来的位置怎么办,又要另一个背锅侠来顶替这个背锅侠吗,其实是不需要的,因为Maxleft肯定不会再属于第三种,它只会属于第一种或第二种情况,因为它既然是左子树最大的,那它肯定不会有右儿子,不然右儿子就是左子树里最大的,所以它可能有左儿子或者没有左儿子,也就对应了第一种情况和第二种情况,如果删除的节点是第二种情况或者背锅侠属于第二种情况,那么直接把这个节点的儿子被其祖父指向即可,我们要如何存储它的祖父呢,与上面一样用node.right/left=递归方法()即可。

**

2.2 java代码实现

**

public static AVLTree Delete(AVLTree node,int Data){
        if(node==null){
            return null;   //未找到
        }

        //先找到要删除的节点
        if(Data>node.Data){
            node.right = Delete(node.right,Data);
        }
        else
        if(Data<node.Data){
            node.left = Delete(node.left,Data);
        }
        else{//找到了,并且是属于第三种情况,要找背锅侠
            if(node.left!=null && node.right!=null){
                node.Data=findInsteadNode(node.left);//找出背锅侠来背锅
                Delete(node.left,Data);//找出背锅侠的原有位置
            }
            else{//背锅侠的位置 或者 是删除的节点(第一或第二种情况)
                if(node.right!=null)
                    node=node.right;
                else
                if(node.left!=null)
                    node=node.left;
                else
                    node=null;
            }
        }

        return node;
    }

    public static int findInsteadNode(AVLTree node){
        if(node.right!=null)
            return findInsteadNode(node.right);
        else
            return node.Data;

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二叉搜索树: 二叉搜索树是一种特殊的二叉树,它的左子树中所有节点的值都小于它的根节点的值,而右子树中所有节点的值都大于它的根节点的值。二叉搜索树支持快速的插入、查找和删除操作,时间复杂度为O(logn)。 插入删除: 插入操作是将一个新节点插入二叉搜索树中,找到对应的位置并插入即可。删除操作比插入操作复杂一些,需要考虑到删除节点后二叉搜索树的结构是否仍然满足二叉搜索树的性质。如果需要删除的节点是叶子节点,直接删除即可。如果需要删除的节点只有一个子节点,可以将其子节点上移,删除该节点。如果需要删除的节点有两个子节点,可以找到该节点右子树中最小的节点,将其值复制到需要删除的节点中,然后删除该最小节点。 树遍历: 树的遍历是指按照某种顺序依次访问树中的所有节点。常用的树遍历方式有前序遍历、中序遍历和后序遍历。前序遍历是先访问根节点,然后访问左子树和右子树;中序遍历是先访问左子树,然后访问根节点和右子树;后序遍历是先访问左子树和右子树,然后访问根节点。 AVL树: AVL树是一种自平衡二叉搜索树,它保证了树的任意节点的左右子树高度差不超过1。当插入删除节点时,AVL树会通过旋转操作来保持树的平衡。AVL树的查找、插入删除操作的时间复杂度均为O(logn)。 红黑树: 红黑树也是一种自平衡二叉搜索树,它的插入删除操作比AVL树更快,但查找操作稍慢一些。红黑树通过染色和旋转操作来保持树的平衡,它要求树中任意一条从根到叶子的路径上,红色节点和黑色节点的个数相同。红黑树的时间复杂度也为O(logn)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值