数据结构 Java数据结构 --- 二叉搜索树

x33g5p2x  于2022-03-10 转载在 Java  
字(1.7k)|赞(0)|评价(0)|浏览(468)

二叉搜索树

1. 二叉搜索树的概念

二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树

2. 二叉树操作 - 查找

代码实现:

public Node search(int val){
        while (root != null){
            if(val > root.val){// val>root.val 在右子树查找
                root = root.right;
            }else if(val < root.val){// val<root.val 在左子树查找
                root = root.left;
            }else {// val=root.val 返回该节点即可
                return root;
            }
        }
        return null;
    }

3. 二叉树操作 - 插入

代码实现:

public boolean insert(int val) {
    	// 当为空树的时候 直接插入val
        if(root == null) {
            root = new Node(val);
            return true;
        }
        // 当不为空时的时候,进行判断
        Node parent = null;
        Node child = root;
        while (child != null){
        	// val 较大 寻找右子树
            if(child.val < val){
                parent = child;
                child = child.right;
            }else {//val 较小 寻找左子树
                parent = child;
                child = child.left;
            }
        }
        // 这里 parent的左子树或右子树就可以进行插入,此时进行判断.
        if(parent.val < val){
            parent.right = new Node(val);
        }else {
            parent.left = new Node(val);
        }
        return true;
    }

4. 二叉树操作 - 删除

public void remove(int key) {
        Node cur = root;
        Node parent = null;
        while (cur != null){
            if(cur.val == key){
            	//找到要删除的节点 进行删除
                removeNode(cur,parent);
            }else if(cur.val < key){
                parent = cur;
                cur = cur.right;
            }else {
                parent = cur;
                cur = cur.left;
            }
        }
    }
    public void removeNode(Node cur,Node parent){
        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.right){
                parent.right = cur.left;
            }else {
                parent.left = cur.left;
            }
        }else { // 情况三
            Node targetParent = cur;
            Node target = cur.right;
            while(target.left != null){
                targetParent = target;
                target = target.left;
            }
            cur.val = target.val;
            if(target == targetParent.left){
                targetParent.left = target.right;
            }else {
                targetParent.right = target.right;
            }
        }
    }

5. 性能分析

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树

最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:

最差情况下,二叉搜索树退化为单支树,其平均比较次数为:

相关文章