【数据结构】二叉搜索树的Java代码实现

目录

1.概念

2.图解:

3.元素查找操作

1.前提根节点不为空

2.代码展示:

4.元素插入操作

1.思路分析:

2.代码展示

5.元素删除操作

1.思路分析:

2.代码展示:


1.概念

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

2.图解:

以下数组为例 :int [] arr = [5,3,4,1,7,8,2,6,0,9]

【数据结构】二叉搜索树的Java代码实现_第1张图片

 

3.元素查找操作

1.前提根节点不为空

  • root.val == key 返回true;
  • key > root.val  root= root.right;继续查找
  • key < root.val  root= root.left;继续查找

2.代码展示:

1   //在搜索树中查找 key,如果找到,返回 key 所在的结点,否则返回 null
    public Node search(int key){
        if(root == null){
            return null;
        }
        Node prev = root;
        while(prev != null){
            if(key == prev.val){
                return prev;
            }else if(key > prev.val){
                prev = prev.right;
            }else {
                prev = prev.left;
            }
        }
        return null;
    }

4.元素插入操作

1.思路分析:

  1. 如果树为空树,即根 == null,直接插入
  2.  如果树不是空树,按照查找逻辑确定插入位置,插入新结点​​​​​​

2.代码展示

    //插入
    public boolean insert(int key){
        if(root == null){
            Node p = new Node(key);
            root = p;
            return true;
        }
        Node prev =  root;
        Node parent = null;
        while(prev != null){
            if(key == prev.val){
                return false;
            }else if(key > prev.val){
                parent = prev;
                prev = prev.right;
            }else {
                parent = prev;
                prev = prev.left;
            }
        }
        Node x = new Node(key);
        if(key > parent.val){
            parent.right = x;
        }else {
            parent.left = x;
        }
        return true;
    }

5.元素删除操作

1.思路分析:

  1. 首先保证二叉搜索树不为空,并且key存在于二叉搜索树中
  2. 设带删除的节点为cur,待删除的节点的父节点为parent,那么我们可以看见,待删除结点所处的位置共有四种情况

1. cur.left == null

  •  cur 是 root,则 root = cur.right
  •  cur 不是 rootcur parent.left,则 parent.left = cur.right
  •  cur 不是 rootcur parent.right,则 parent.right = cur.right

2. cur.right == null

  •  cur root,则 root = cur.left
  •  cur 不是 rootcur parent.left,则 parent.left = cur.left
  •  cur 不是 rootcur parent.right,则 parent.right = cur.left

3. cur.left != null && cur.right != null

  •  需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被 删除节点中,再来处理该结点的删除问题

2.代码展示:

    //删除
    public boolean remove(int key){
        if(root == null){
            return false;
        }
        //先找到要删除的节点,以及父节点
        Node prev = root;
        Node parent = null;
        while(prev != null){
            if(key == prev.val){
                break;
            }else if(prev.val > key){
                parent = prev;
                prev = prev.left;
            }else {
                parent = prev;
                prev = prev.right;
            }
        }
        //说明没找到
        if(prev == null){
            return false;
        }
        if(prev.left == null && prev.right == null){
            if(parent.left == prev){
                parent.left = null;
            }else {
                parent.right = null;
            }
        }else if(prev.left == null){
            if(parent.left == prev){
                parent.left = prev.right;
            }else {
                parent.right = prev.right;
            }
        }else if(prev.right == null){
            if(parent.left == prev){
                parent.left = prev.left;
            }else {
                parent.right = prev.left;
            }
        }else {
            Node x = prev.right;
            while(x.left != null){
                x = x.left;
            }
            remove(x.val);
            prev.val = x.val;
        }
        return true;
    }

你可能感兴趣的:(二叉树,Java语法,哈希表,数据结构,java,算法)