美文网首页
二叉查找树操作

二叉查找树操作

作者: Baltan | 来源:发表于2019-02-21 15:26 被阅读0次

插入节点

    /**
     * 二叉查找树插入节点
     *
     * @param root
     * @param node
     * @return
     */
    public static TreeNode<Integer> addNode(TreeNode<Integer> root, TreeNode<Integer> node) {
        if (node == null) {
            return root;
        }
        if (root == null) {
            return node;
        }
        if (node.getData() < root.getData()) {
            if (root.getLeft() == null) {
                root.setLeft(node);
            } else {
                root.setLeft(addNode(root.getLeft(), node));
            }
        } else if (node.getData() > root.getData()) {
            if (root.getRight() == null) {
                root.setRight(node);
            } else {
                root.setRight(addNode(root.getRight(), node));
            }
        }
        return root;
    }

查找节点

    /**
     * 二叉查找树查找节点
     *
     * @param root
     * @param value
     * @return
     */
    public static TreeNode<Integer> searchNode(TreeNode<Integer> root, int value) {
        if (root == null) {
            return null;
        }
        if (root.getData() == value) {
            return root;
        } else if (root.getData() < value) {
            return searchNode(root.getRight(), value);
        } else {
            return searchNode(root.getLeft(), value);
        }
    }

删除节点

    /**
     * 二叉查找树删除节点
     *
     * @param root
     * @param value
     * @return
     */
    public static TreeNode<Integer> deleteNode(TreeNode<Integer> root, int value) {
        if (root == null) {
            return null;
        }
        /**
         * 查找要删除的节点
         */
        TreeNode<Integer> node = SearchNodeTest.searchNode(root, value);
        if (node == null) {
            return root;
        }
        /**
         * 查找要删除的节点的父节点
         */
        TreeNode<Integer> parent = searchParentNode(root, value);

        if (node.getLeft() == null && node.getRight() == null) {
            /**
             * 删除的节点为叶节点
             */
            if (parent == null) {
                root = null;
            } else {
                if (parent.getLeft() != null && parent.getLeft().getData() == value) {
                    parent.setLeft(null);
                } else {
                    parent.setRight(null);
                }
            }
        } else if (node.getLeft() != null && node.getRight() == null) {
            /**
             * 删除的节点只有左子树
             */
            if (parent == null) {
                root = root.getLeft();
            } else {
                if (parent.getLeft() != null && parent.getLeft().getData() == value) {
                    parent.setLeft(node.getLeft());
                } else {
                    parent.setRight(node.getLeft());
                }
            }
        } else if (node.getRight() != null && node.getLeft() == null) {
            /**
             * 删除的节点只有右子树
             */
            if (parent == null) {
                root = root.getRight();
            } else {
                if (parent.getLeft() != null && parent.getLeft().getData() == value) {
                    parent.setLeft(node.getRight());
                } else {
                    parent.setRight(node.getRight());
                }
            }
        } else {
            /**
             * 删除节点既有左子树,又有右子树
             */
            int minValue = deleteMinNode(root, node.getRight());
            node.setData(minValue);
        }
        return root;
    }

    /**
     * 二叉查找树删除权最小的节点
     *
     * @param root
     * @param subRoot
     * @return
     */
    private static int deleteMinNode(TreeNode<Integer> root, TreeNode<Integer> subRoot) {
        TreeNode<Integer> node = subRoot;
        /**
         * 找到二叉查找树中权最小的节点
         */
        while (node.getLeft() != null) {
            node = node.getLeft();
        }
        /**
         * 最小权节点不可能有左子树,因为左节点的权会比该节点的权更小
         *
         * 若最小权节点没有右子树,则该节点为叶节点,并且只可能为其双亲节点的左节点,因为权小于双亲节点的权
         *
         *         TreeNode<Integer> parent = searchParentNode(root, node.getData());
         *
         *         if (node.getRight() == null) {
         *             parent.setLeft(null);
         *         } else {
         *             parent.setLeft(node.getRight());
         *         }
         */
        /**
         * 若最小权节点的权等于子树根节点的值,说明最小权节点就是子树的根节点,且子树没有左子树,
         * 否则左子树上节点的值小于根节点的权
         */
        if (subRoot.getData() == node.getData()) {
            TreeNode<Integer> parent = searchParentNode(root, node.getData());
            parent.setRight(node.getRight());
        } else {
            deleteNode(subRoot, node.getData());
        }
        return node.getData();
    }

    /**
     * 二叉查找树查找给定节点的父节点
     *
     * @param root
     * @param value
     * @return
     */
    private static TreeNode<Integer> searchParentNode(TreeNode<Integer> root, int value) {
        if (root == null) {
            return null;
        }
        if (root.getLeft() == null && root.getRight() == null) {
            return null;
        } else if (value < root.getData()) {
            if (root.getLeft() == null) {
                return null;
            } else {
                if (root.getLeft() != null && root.getLeft().getData() == value) {
                    return root;
                } else {
                    return searchParentNode(root.getLeft(), value);
                }
            }
        } else if (value > root.getData()) {
            if (root.getRight() == null) {
                return null;
            } else {
                if (root.getRight() != null && root.getRight().getData() == value) {
                    return root;
                } else {
                    return searchParentNode(root.getRight(), value);
                }
            }
        }
        return null;
    }

相关文章

  • 二叉查找树

    基本操作 1. 二叉查找树元素的插入 2. 二叉查找树的查找操作 题目 TODO

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 7天练|Day5:二叉树和堆

    关于二叉树和堆的7个必知必会的代码实现二叉树实现一个二叉查找树,并且支持插入、删除、查找操作实现查找二叉查找树中某...

  • 二叉树(下)

    二叉树中有种特殊的树是二叉查找树,其最大的特点就是,支持动态的快速插入、删除、查找操作。 其实除了二叉查找树外,散...

  • 红黑树

    红黑树 红黑树和平衡二叉查找树(AVL树)类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获...

  • 24-二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树

    今天来学习一种特殊的的二叉树二叉查找树。二叉查找树最大的特点就是支持动态数据集合的快速插入、删除、查找操作。 我们...

  • 极客时间数据结构与算法之美笔记25~26

    二叉树到二叉查找树,是为了查找数据的效率接近logN。 二叉查找树到平衡二叉查找树,是为了防止二叉查找树沦为链表。...

  • 伸展树

    概念 伸展树是一种二叉查找树,它能在O(logn)内完成插入、查找和删除操作。伸展树是一种自调整形式的二叉查找树,...

  • 红黑树分析笔记

    阅读本文的前提 1、知道二叉查找树的概念,插入、删除和查找操作;2、知道二叉树的左旋和右旋。3、了解二叉平衡树(A...

  • 数据结构与算法——红黑树

    前面我们提到了二叉查找树,支持快速的查找、插入和删除操作。中序遍历二叉查找树,可以输出有序的数据序列,非常高效。 ...

网友评论

      本文标题:二叉查找树操作

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