二叉搜索树

左节点均比根节点值小,右节点均比根节点值大。

一.构造(插入)二叉树

构造二叉搜索树先输入一组数据,循环插入这一组数据

BinarySearchTree binarySearchTree = new BinarySearchTree();
        for(int i = 0 ; i < array.length ; i++){
            binarySearchTree.insert(array[i]);
        }

首先创建新的节点,判断该搜索二叉树是否为空,为空时将该节点赋值给root节点。

 public void insert(int key){
        Node node = new Node(key);
        if(root == null){
            root = node;
            return;
        }

判断过后创建父亲节点parent以及当前节点cur,寻找适合插入的空节点位置,并记录该位置的父亲节点,判断插入值与父亲节点值的大小来进行插入。

Node cur = root;
        Node parent = null;

        while(cur != null){
            if(cur.val < key){
                parent = cur;
                cur = cur.right;
            }else if(cur.val > key){
                parent = cur;
                cur = cur.left;
            }else{
                System.out.println("不可插入");
                return;
            }
        }

        if(parent.val < key){
            parent.right = node;
        }
        if(parent.val > key){
            parent.left = node;
        }
    }  }

二.查找数据

public boolean Search(int key){
        if(root == null){
            return false;
        }
        Node cur = root;

        while(cur != null){
            if(cur.val == key){
                return true;
            }else if(cur.val < key){
                cur = cur.right;
            }else{
                cur = cur.left;
            }
        }
        return  false;
    }

三.删除数据

首先,找出删除数据的父亲节点以及当前节点

public void remove(int key){
        if(root == null){
            return;
        }

        Node cur = root;
        Node parent = null;
        while(cur!= null){
            if(cur.val < key){
                parent = cur;
                cur = cur.right;
            }else if(cur.val > key){
                parent = cur;
                cur = cur.left;
            }else{
                removeNode(parent , cur);
                return;
            }
        }

执行删除步骤需要考虑多种情况:

(1).删除数据的左节点为空

 public void removeNode(Node parent , Node cur){
        if(cur.left == null){
            if(root == cur){
                root = cur.right;
            }else if(cur == parent.left){
                parent.left = cur.right;
            }else{
                parent.right = cur.right;
            }

(2).删除数据的右节点为空

else if(cur.right == null){
            if(root == cur){
                root = cur.left;
            }else if(cur == parent.left){
                parent.left = cur.left;
            }else {
                parent.right = cur.left;
            }

(3).删除数据的左右节点均为空

选取删除节点左子树的最大值,或选取删除节点右子树的最小值,替换删除节点,再将此最值进行删除。

例如删除节点值为7,寻找该节点右子树的最小值

最小值替换删除节点

再将t节点删除

该代码选取右子树的最小值

else{
                Node tp = cur;
                Node t = tp.right;
                while(t.left != null){
                    tp = t;
                    t = t.left;
                }
                cur.val = t.val;

                if(tp.left == t){
                    tp.left = t.right;
                }else{
                    tp.right = t.right;
                }
            }

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值