欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二叉搜索树

程序员文章站 2022-05-06 23:43:03
...

二叉搜索树

概念:二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下 性质的二叉树:
1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
3.它的左右子树也分别为二叉搜索树

二叉搜索树
二叉搜索树的操作
一:查找
原理:如果查找值小于当前节点的值,就去该节点的左子树去查找,如果查找值大于当前节点的值,就去该节点的右子树去查找

class Node {
        public int val;
        public Node left;
        public Node right;
        public Node(int val) {
            this.val = val;
        }
     public Node search(int key){
        Node cur = root;
        while(cur != null) {
            if (cur.val == key) {
                return cur;
            }else if (key > cur.left.val) {
                cur = cur.right;
            } else {
                cur = cur.left;
            }
        }
        return null;
    }

二:插入
原理:最终插入的一定是该树的叶子节点

class Node {
        public int val;
        public Node left;
        public Node right;
        public Node(int val) {
            this.val = val;
        }
public void insert(int key) {
        Node node = new Node(key);
        if(root == null) {
            root = node;
            return;
        }
        Node cur = root;
        Node parent = cur;
        while (cur != null) {
            if(cur.val == key){
                return;
            }
            if(cur.val < key){
                parent = cur;
                cur = cur.right;
            }else{
                parent = cur;
                cur = cur.left;
            }
        }
        if(parent.val > key){
            parent.left = node;
        }else{
            parent.right = node;
        }

    }        

三:删除
原理:
A. cur.left == null

  1. cur 是 root,则 root = cur.right
  2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.right
  3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.right
    B. cur.right == null
  4. cur 是 root,则 root = cur.left
  5. cur 不是 root,cur 是 parent.left,则 parent.left = cur.left
  6. cur 不是 root,cur 是 parent.right,则 parent.right = cur.left
    C. cur.left != null && cur.right != null
  7. 找到右子树最小的值,替换到要删除的节点,然后将找到的最小的值删除掉。
class Node {
        public int val;
        public Node left;
        public Node right;
        public Node(int val) {
            this.val = val;
        }
public void remove(int key) {
        Node cur = root;
        Node parent = null;
        while (cur != null) {
            if(cur.val == key) {
                //删除
                removeNode(parent,cur);
                return;
            }else if(cur.val > key) {
                parent = cur;
                cur = cur.left;
            }else {
                parent = cur;
                cur = cur.right;
            }
        }
    }

    /**
     *
     * @param parent 要删除节点的父亲节点
     * @param cur 代表要删除的节点
     */
    public void removeNode(Node parent,Node cur) {
        if(cur.left == null){
            if(cur == root){
                root = cur.right;
            }else if(cur == parent.left){
                parent.left = cur.right;
            }else{
                parent.right = cur.right;
            }
        }else if(cur.right == null){
            if(cur == root){
                root = cur.left;
            }else if(cur == parent.left){
                parent.left = cur.left;
            }else{
                parent.right = cur.left;
            }
        }else{
            Node targetParent = cur;
            Node target = cur.right;
            while (target.left != null) {
                targetParent = target;
                target = target.left;
            }
            //target->右树当中最小的元素
            cur.val = target.val;
            if(target == targetParent.left) {
                targetParent.left = target.right;
            }else {
                targetParent.right = target.right;
            }
        }

    }        
相关标签: 二叉搜索树