91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

    襄樊市| 宜兴市| 泸溪县| 花莲县| 宿迁市| 定南县| 乌兰察布市| 象州县| 舞钢市| 广平县| 永善县| 瑞安市| 尉犁县| 武鸣县| 奈曼旗| 郑州市| 正蓝旗| 诸城市| 沧州市| 蒙山县| 霍城县| 扎赉特旗| 德江县| 新竹县| 汝阳县| 枣阳市| 普兰县| 工布江达县| 五寨县| 绥化市| 图们市| 上虞市| 塔河县| 中阳县| 博客| 泽库县| 湄潭县| 青川县| 桦南县| 平昌县| 绥滨县|