亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Java數據結構之二叉搜索樹實例分析

發布時間:2022-06-06 09:26:23 來源:億速云 閱讀:174 作者:zzz 欄目:開發技術

這篇文章主要介紹“Java數據結構之二叉搜索樹實例分析”,在日常操作中,相信很多人在Java數據結構之二叉搜索樹實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java數據結構之二叉搜索樹實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    性質

    二叉搜索樹或者是一棵空樹,或者是具有下列性質的一棵二叉樹,如果當前節點具有左子樹,則左子樹上的每一個節點值均小于等于當前節點值,如果當前節點具有右子樹,則右子樹上的每一個節點值均大于等于當前節點值。依據這個性質,當我們前序遍歷二叉搜索樹的時候,得到的序列應該是從小到大的非遞減序列。同時搜索指定值時,只需要與當前節點比較,根據相對大小在左子樹或者右子樹上進行搜索。

    Java數據結構之二叉搜索樹實例分析

    實現

    根據二叉搜索樹的性質我們接下來需要實現插入節點,查詢節點,刪除節點功能。

    節點結構

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

    初始化

    這里我們假設所有節點值大于0,初始化一個頭節點。ps:對于樹,鏈表這類數據結構,為了使第一個節點操作與其他節點保持一致,方便操作,常見的方法是添加一個額外的頭節點,指向第一個節點。

    TreeNode head;
        private void init() {
            //添加一個頭節點
            head = new TreeNode(-1);
        }

    插入節點

    從頭節點開始我們遍歷二叉搜索樹,如果當前節點值小于等于插入節點值,則插入節點在當前節點的右子樹上,否則在左子樹上,一直深度遍歷知道當前節點的右子樹(左子樹)為空,則插入。

    Java數據結構之二叉搜索樹實例分析

    /**
         * 插入新節點,假設新節點均大于0
         * @param val 插入節點值
         * @return 插入的節點
         */
        public TreeNode insert(int val) {
            TreeNode temp = head;
            while (true) {
                if (temp.val < val) {
                    //val應該在右子樹上
                    if (null != temp.right) {
                        temp = temp.right;
                        continue;
                    } else {
                        temp.right = new TreeNode(val);
                        return temp.right;
                    }
                }
                //應該在左子樹上
                if (null != temp.left) {
                    temp = temp.left;
                    continue;
                }
                temp.left = new TreeNode(val);
                return temp.left;
            }
        }

    查找節點

    查找節點的步驟其實在插入節點的時候已經有體現,其實就是將查找值與當前節點比較,大于當前節點走右子樹,小于當前節點走左子樹,直到值匹配返回節點,或者沒有找到返回null。ps:這里為了后面方便實現刪除,同時返回了當前節點以及當前節點的父節點,這里使用了commons-lang3包下的Pair工具。

    Java數據結構之二叉搜索樹實例分析

    /**
         * 搜索節點值
         * @param val
         * @return
         */
        public Pair<TreeNode, TreeNode> find(int val) {
            TreeNode temp = head.right;
            TreeNode parent = head;
            while (null != temp) {
                if (temp.val == val) {
                    return Pair.of(temp, parent);
                }
                parent = temp;
                if (temp.val < val) {
                    //在右子樹上
                    temp = temp.right;
                    continue;
                }
                temp = temp.left;
            }
            return null;
        }

    刪除節點

    刪除節點時候我們需要先找到刪除節點的位置,然后做對應操作。有三種情況:

    1.如果刪除的是葉子節點直接刪除

    Java數據結構之二叉搜索樹實例分析

    2.如果刪除的節點只有左子樹或者右子樹,則直接將左子樹或者右子樹節點放在刪除節點位置

    Java數據結構之二叉搜索樹實例分析

    3.如果刪除節點同時有左子樹和右子樹,則將右子樹節點放在原來節點位置,將左子樹放在右子樹最左邊節點左子樹上(反之將左子樹放在原來節點位置,右子樹放在左子樹最右邊節點右子樹上也可)

    Java數據結構之二叉搜索樹實例分析

    /**
         * 1.如果刪除的是葉子節點直接刪除,
         * 2.如果刪除的節點只有左子樹或者右子樹,則直接將左子樹或者右子樹節點放在刪除節點位置
         * 3.如果刪除節點同時右左子樹和右子樹,則將右子樹節點放在原來節點位置,將左子樹放在右子樹最左邊節點左子樹上
         * @param val
         */
        public void delete(int val) {
            //找到刪除節點,刪除節點父節點
            Pair<TreeNode, TreeNode> curAndParent = this.find(val);
            TreeNode cur = curAndParent.getLeft();
            TreeNode parent = curAndParent.getRight();
            //記錄刪除當前節點后,當前節點位置放置哪個節點
            TreeNode changed;
            if (null == cur.left && null == cur.right) {
                changed = null;
            } else if (null != cur.left && null != cur.right) {
                TreeNode tempRight = cur.right;
                while (null != tempRight.left) {
                    //找到最左側節點
                    tempRight = tempRight.left;
                }
                tempRight.left = cur.left;
                changed = cur.right;
            } else if (null != cur.left) {
                changed = cur.left;
            } else {
                changed = cur.right;
            }
            if (parent.left == cur) {
                parent.left = changed;
                return;
            }
            parent.right = changed;
        }

    到此,關于“Java數據結構之二叉搜索樹實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

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

    AI

    延吉市| 平罗县| 孝义市| 长沙市| 永顺县| 海晏县| 金坛市| 乌苏市| 龙口市| 巴彦淖尔市| 张家港市| 松溪县| 贺州市| 鄂托克旗| 黄冈市| 修文县| 阿克苏市| 文成县| 婺源县| 定结县| 裕民县| 江安县| 云安县| 抚州市| 临澧县| 化州市| 桦南县| 壶关县| 黄平县| 宿松县| 临潭县| 大竹县| 特克斯县| 云霄县| 榆中县| 宜黄县| 泾阳县| 铁力市| 桂阳县| 麻栗坡县| 方正县|