美文网首页数据结构与算法
二叉排序树(二叉查找树)

二叉排序树(二叉查找树)

作者: 暮想sun | 来源:发表于2019-12-23 15:47 被阅读0次

若它的左子树不空,则左子树上所有节点的值小于它的根节点的值;
若它的右子树不空,则右子树上所有节点的值大于它的根节点的值;
它的左右子树也分别是二叉排序树。

初始化:

    private static class BinarySearchNode {
        private int data;
        private BinarySearchNode left;
        private BinarySearchNode right;
        public BinarySearchNode() {
        }

        public BinarySearchNode(int data) {
            this.data = data;
        }

    }

    //根节点
    private BinarySearchNode root;

查询:

    public BinarySearchNode search(int key) {
        BinarySearchNode startNode = root;
        while (startNode != null) {

            if (startNode.data == key) {
                return startNode;
            } else if (startNode.data < key) {
                startNode = startNode.right;
            } else {
                startNode = startNode.left;
            }
        }

        return null;
    }

插入:

      public void insert(int key) {
        BinarySearchNode newNode = new BinarySearchNode(key);

        if(root == null){
            root = newNode;
            return;
        }

        BinarySearchNode current = root;
        while (current !=null) {

            if (current.data < key) {

                if (current.right != null) {
                    current = current.right;
                } else {
                    current.right = newNode;

                    return;
                }

            } else if (current.data > key) {
                if (current.left != null) {
                    current = current.left;
                } else {
                    current.left = newNode;
                    return;
                }

            }
        }

    }

删除:

    public void delete(int val){
        //从根节点遍历查找要删除的结点,以及其双亲结点
       BinarySearchNode deleteNode = root;
       BinarySearchNode parentNode = null;
       while (deleteNode !=null && deleteNode.data != val){
           parentNode = deleteNode;
           if(deleteNode.data > val){
               deleteNode = deleteNode.left;
           }else {
               deleteNode = deleteNode.right;
           }
       }

       if(deleteNode == null){
           System.out.println("没有找到要删除数据结点");
           return;
       }

       //存在左右子节点,则找到右子树的最小节点,与要删除节点交换。再删除这个最小节点。
       if(deleteNode.right != null && deleteNode.left !=null){
           BinarySearchNode minNode = deleteNode.right;
           BinarySearchNode minParentNode = deleteNode;
           while (minNode.left !=null){
               minParentNode = minNode;
               minNode = minNode.left;
           }

           deleteNode.data = minNode.data;
           deleteNode = minNode;
           parentNode = minParentNode;

       }


       //如果要删除的左节点不为空,则孩子节点为其左节点,右节点不为空,孩子节点为其右节点。找个替代的结点
       BinarySearchNode childNode ;
       if(deleteNode.left !=null){
           childNode =deleteNode.left;
       }else if(deleteNode.right !=null){
           childNode = deleteNode.right;
       }else {
           childNode = null;
       }


       //父节点为空,则未删除根节点。将对应孩子结点数据赋值给该结点。
       if(parentNode == null){
           root = childNode;
       }else if(parentNode.left ==deleteNode){
           parentNode.left = childNode;
       }else {
           parentNode.right = childNode;
       }

    }

查找最小节点:

    public BinarySearchNode getMin(){
        if(root == null){
            return null;
        }

        BinarySearchNode leftNode = root;
        while (leftNode.left != null){
            leftNode = leftNode.left;
        }
        return leftNode;
    }

查找最大节点:

    public BinarySearchNode getMax(){
        if(root == null){
            return null;
        }

        BinarySearchNode rightNode = root;
        while (rightNode.right !=null){
            rightNode = rightNode.right;
        }

        return rightNode;


    }

相关文章

  • Binary Search Tree

    如果二叉排序树是平衡的,则n个节点的二叉排序树的高度为 ,其查找效率为 ,近似于折半查找。如果二叉排序树完全不平衡...

  • 二叉查找树

    一、二叉查找树(BTS) 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Searc...

  • 二叉排序树

    1、二叉树的二叉链表结点结构定义 2、二叉排序树--查找 递归查找二叉排序树T中,是否存在key;指针f指向T的双...

  • 数据结构题目59:二叉排序树的查找

    题目:二叉排序树的查找。解题思路:其查找过程是:若二叉排序树为空,则查找失败,结束查找,返回信息null;否则,将...

  • 数据结构学习第四弹 二叉排序树

    二叉排序树又称为二叉搜索树或二叉查找树,这是一种插入、删除和检索记录效率都很高的树结构 二叉排序树概念 二叉排序树...

  • 【数据结构】二叉排序树(Binary Sort Tree)(建立

    二叉排序树定义 二叉排序树(Binary Sort Tree),又称二叉查找树。它是一颗空树,或者具有下列性质: ...

  • 二叉排序树

    二叉排序树百度百科定义 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search...

  • 数据结构中的各种树

    一、二叉树 二、二叉查找树(又称二叉排序树,二叉搜索树) 二叉查找树(Binary Search Tree)它或者...

  • 二叉排序树

    1、二叉排序树定义 二叉排序树也叫二叉搜索树、二叉查找树。二叉排序树树是一颗它的左子树上的节点都小于根节点,右子树...

  • 进阶二叉树

    常见的二叉树 以下的二叉树采用的结构都为链式结构 1. 二叉排序树 二叉排序树又称“二叉查找树”、“二叉搜索树”。...

网友评论

    本文标题:二叉排序树(二叉查找树)

    本文链接:https://www.haomeiwen.com/subject/sanznctx.html