中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么實現二叉查找樹的增刪查

發布時間:2022-06-28 13:56:49 來源:億速云 閱讀:114 作者:iii 欄目:開發技術

本篇內容介紹了“Java怎么實現二叉查找樹的增刪查”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

定義

二叉查找樹(ADT)是一個具有對于樹種的某個節點X,它的左節點都比X小,它的右節點都比X大的二叉樹。如下就是一個符合

要求的二叉查找樹:

Java怎么實現二叉查找樹的增刪查

增加節點

1.定義節點類:

class Node{
    int val;
    Node left;
    Node right;
    public Node(int val){
        this.val=val;
    }
}

2.插入元素

我們采用遞歸的方法:

1.判斷與根節點是否相同,相同無需操作

2.比根元素小往左邊查找,左節點不存在的話則作為左節點插入即可

3.比根元素大往右邊查找,右節點不存在的話則作為右節點插入即可

代碼實現如下:

Node root;
 
    /**
     * 添加元素
     * @param val
     */
    public void add(int val){
        if(root==null){
            root=new Node(val);
            return;
        }
        addNode(val,root);
    }
    private void addNode(int val,Node root){
        if(root==null || root.val==val){
            return;
        }
        if(root.val>val){
            if(root.left==null){
                root.left=new Node(val);
            }else {
                addNode(val,root.left);
            }
        }else {
            if(root.right==null){
                root.right=new Node(val);
            }else {
                addNode(val,root.right);
            }
        }
    }

查詢節點

我們采用遞歸的方法:

1.判斷與根節點是否相同,相同則返回true

2.比根元素小往左邊查找,左節點為null則返回false表示不存在

3.比根元素大往右邊查找,右節點為null則返回false表示不存在

代碼實現如下:

/**
     * 判斷指定值是否存在
     * @param val 指定值
     * @return true--存在   false--不存在
     */
    public boolean findVale(int val){
        return isExit(root,val);
    }
 
    private boolean isExit(Node node,int val){
        if(node==null){
            return false;
        }
        if(node.val==val){
            return true;
        }else if(node.val>val){
            return isExit(node.left,val);
        }else {
            return isExit(node.right,val);
        }
    }

刪除節點

刪除元素時要判斷元素的情況:

1.刪除的元素沒有葉子節點,直接刪除,如刪除值為1的節點,雖然平衡性不是太好,但是還是符合二叉查找樹的特性

Java怎么實現二叉查找樹的增刪查

2.刪除的元素只有一個節點,刪除元素并將指針指向其子節點 ,如刪除值為4的節點:

Java怎么實現二叉查找樹的增刪查

3.刪除的元素有左右兩個節點,從右節點中找出大于該節點的最小節點,作為新的節點A,如刪除節點值為2的節點:

Java怎么實現二叉查找樹的增刪查

代碼實現如下:

/**
     * 刪除元素
     * 1.刪除的元素沒有葉子節點,直接刪除
     * 2.刪除的元素只有一個節點,刪除元素并將指針指向其子節點
     * 3.刪除的元素有兩個節點,從右節點中找出大于該元素的最小值,作為新的節點
     * @param val
     */
    public void deleteElement(int val){
        deleteElement(null,root,val,true);
    }
 
    /**
     * 刪除元素
     * @param prev 父節點
     * @param root 當前節點
     * @param val  刪除值
     * @param isright  是否是右節點
     */
    private void deleteElement(Node prev,Node root,int val,boolean isright){
        if(root.val==val){
            //刪除的元素沒有葉子節點,直接刪除
            if(root.left==null &&  root.right==null){
                changeValue(prev,null,isright);
            }else if(root.left!=null &&  root.right!=null){
                //3.刪除的元素有兩個節點,從右節點中找出大于該元素的最小值,作為新的節點
                changeValue(prev,new Node(findMinGt(root,root.right,true)),isright);
                if(prev==null){
                    //對于頭結點的刪除特殊處理
                    prev=this.root;
                    prev.left=root.left;
                    prev.right=root.right;
                    return;
                }
                if(isright){
                    prev.right.right=root.right;
                    prev.right.left=root.left;
                }else {
                    prev.left.right=root.right;
                    prev.left.left=root.left;
                }
            }//刪除的元素只有一個節點,刪除元素并將指針指向其子節點
            else if(root.left!=null){
                changeValue(prev,root.left,isright);
            }else {
                changeValue(prev,root.right,isright);
            }
            return;
        }
        if(root.val>val){
            deleteElement(root,root.left,val,false);
        }else{
            deleteElement(root,root.right,val,true);
        }
    }
    //改變元素值
    private void changeValue(Node prev,Node value,boolean isright){
        if(prev==null){
            root=value;
            return;
        }
        if(isright){
            prev.right=value;
        }else {
            prev.left=value;
        }
    }
    //尋找大于根節點的最小值
    private int findMinGt(Node prev,Node root,boolean isRight){
        if(root.left==null && root.right==null){
            changeValue(prev,null,isRight);
            return root.val;
        }
        if(root.left==null){
            changeValue(prev,null,isRight);
            return root.val;
        }
        return findMinGt(root,root.left,false);
    }

“Java怎么實現二叉查找樹的增刪查”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰宁县| 辛集市| 桐柏县| 连云港市| 富川| 河北区| 盐亭县| 疏附县| 四川省| 东阳市| 紫云| 铜鼓县| 泽州县| 利川市| 图木舒克市| 澄迈县| 焦作市| 渝北区| 平乡县| 通许县| 会同县| 合山市| 巧家县| 武山县| 惠水县| 五华县| 峨边| 固安县| 东至县| 阜宁县| 明星| 江北区| 涟水县| 中西区| 什邡市| 安陆市| 鄂托克前旗| 东辽县| 若羌县| 新乡市| 临泽县|