码迷,mamicode.com
首页 > 编程语言 > 详细

二叉排序树

时间:2020-07-27 09:35:38      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:lang   roo   arch   void   OLE   etl   setvalue   情况   删除   

二叉排序树

二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。

二叉排序树创建和遍历

? 一个数组创建成对应的二叉排序树,并使用中序遍历二叉排序树 使用中序遍历的二叉树结点数值由小到大排序

/**
     * 二叉排序树的创建
     * @param value 结点的值
     * @return 创建的根节点
     */
    public static BinarySortNode createTree(int value) {
        return new BinarySortNode(value);

    }

    /**
     * 向二叉排序树中添加数值
     * @param root 二叉排序树的根节点
     * @param value 要添加的数值
     */
    public static void add(BinarySortNode root, int value) {
        if (root == null) return;
        if (root.getValue() > value) {
            if (root.getLeft() == null) {
                root.setLeft(new BinarySortNode(value));
            } else {
                add(root.getLeft(), value);
            }
        } else {
            if (root.getRight() == null) {
                root.setRight(new BinarySortNode(value));
            } else {
                add(root.getRight(), value);
            }
        }

    }


    public static  void  inOrderTraversal(BinarySortNode node){
        if (node==null)return;
        inOrderTraversal(node.getLeft());
        System.out.println(node.getValue());
        inOrderTraversal(node.getRight());
    }

二叉排序树的删除

二叉排序树的删除情况比较复杂,有下面三种情况需要考虑

删除叶子节点

删除只有一颗子树的节点

删除有两颗子树的节点.

/**
     * 二叉排序树查找
     *
     * @param value 要查找的值
     * @return 找到后返回找到结点 找不到返回null
     */
    public static BinarySortNode search(BinarySortNode node, int value) {
        if (node == null) return null;
        else if (node.getValue() == value) return node;
        else if (node.getValue() > value) {
            return search(node.getLeft(), value);
        } else if (node.getValue() < value) {
            return search(node.getRight(), value);
        } else {
            return null;
        }

    }

    /**
     * 查找要删除结点的父亲结点
     *
     * @param node
     * @param value
     * @return
     */
    public static BinarySortNode searchFather(BinarySortNode node, int value) {
        if (node == null) return null;
        else if ((node.getLeft() != null && node.getLeft().getValue() == value) || (node.getRight() != null && node.getRight().getValue() == value))
            return node;
        else if (node.getValue() > value) {
            return searchFather(node.getLeft(), value);
        } else if (node.getValue() < value) {
            return searchFather(node.getRight(), value);
        } else {
            return null;
        }
    }


    public static BinarySortNode searchMinNode(BinarySortNode node) {

        if (node.getLeft() == null) return node;
        else return searchMinNode(node.getLeft());

    }

    /**
     * @param value 要删除结点的值
     * @return 删除是否成功 成功返回true 失败返回false
     */
    public static boolean delete(BinarySortNode root, int value) {
        BinarySortNode father = searchFather(root, value);
        BinarySortNode node = search(root, value);
        if (node.getRight() == null && node.getLeft() == null) {
            //要删除的结点是叶子结点 即左右孩子均为空

            if (father.getLeft() == node) {
                //要删除的结点在父节点的左结点上
                father.setLeft(null);
                return true;
            } else if (father.getRight() == node) {
                //要删除的结点在父节点的右节点上
                father.setRight(null);
                return true;
            } else {
                return false;
            }

        } else if (node.getRight() == null && node.getLeft() != null) {
            //要删除的结点只有一个孩子结点 只有左孩子

            if (father.getLeft() == node) {
                //要删除的结点在父节点的左结点上
                father.setLeft(node.getLeft());
                return true;
            } else if (father.getRight() == node) {
                //要删除的结点在父节点的右节点上
                father.setRight(node.getLeft());
                return true;
            } else {
                return false;
            }

        } else if (node.getRight() != null && node.getLeft() == null) {
            //要删除的结点只有一个结点 只有右孩子

            if (father.getLeft() == node) {
                //要删除的结点在父节点的左结点上
                father.setLeft(node.getRight());
                return true;
            } else if (father.getRight() == node) {
                //要删除的结点在父节点的右节点上
                father.setRight(node.getRight());
                return true;
            } else {
                return false;
            }

        } else {
            //要删除的结点左右孩子均不为空

            BinarySortNode minNode = searchMinNode(node.getRight());
            if (father == null) {
                //要删除的是根节点
                BinarySortNode minFather = searchFather(root, minNode.getValue());
                if (minFather==root){
                    minFather.setValue(minNode.getValue());
                    minFather.setRight(minNode.getRight());

                    return true;
                }else {
                    root.setValue(minNode.getValue());
                    minFather.setLeft(minNode.getRight());
                }

//                minFather.setLeft(minNode.getRight());
//               node.setValue(minNode.getValue());


                return false;
            } else if (father.getLeft() == node) {
                //要删除的结点在父节点的左结点上
                if (node.getRight() == minNode) {
                    father.setLeft(minNode);
                } else {
                    BinarySortNode minFather = searchFather(father, minNode.getValue());
                    minFather.setLeft(minNode.getRight());
                    node.setValue(minNode.getValue());
                    minNode=null;
                }

                return true;
            } else if (father.getRight() == node) {
                //要删除的结点在父节点的右节点上
                if (node.getRight() == minNode) {
                    father.setRight(minNode);
                } else {
                    BinarySortNode minFather = searchFather(father, minNode.getValue());
                    minFather.setLeft(minNode.getRight());
                    node.setValue(minNode.getValue());
                    minNode=null;
                }
                return true;
            } else {

                return false;
            }

        }


    }

二叉排序树

标签:lang   roo   arch   void   OLE   etl   setvalue   情况   删除   

原文地址:https://www.cnblogs.com/huangshen/p/13382977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!