【亡羊補牢】挑戰資料結構與演算法 第39期 LeetCode 501. 二叉搜尋樹中的眾數(二叉樹)

一百個Chocolate發表於2020-09-24

仰望星空的人,不應該被嘲笑

題目描述

給定一個有相同值的二叉搜尋樹(BST),找出 BST 中的所有眾數(出現頻率最高的元素)。

假定 BST 有如下定義:

  • 結點左子樹中所含結點的值小於等於當前結點的值
  • 結點右子樹中所含結點的值大於等於當前結點的值
  • 左子樹和右子樹都是二叉搜尋樹

例如:

給定 BST [1,null,2,2],

   1
    \
     2
    /
   2
返回[2].

提示:如果眾數超過1個,不需考慮輸出順序

進階:你可以不使用額外的空間嗎?(假設由遞迴產生的隱式呼叫棧的開銷不被計算在內)

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解題思路

由於 BST(二叉搜尋樹)的特殊性,我們採用遞迴來中序遍歷,訪問的節點值是有序的。然後重複節點,用計數器進行累加即可,如果有新值出現,則更新新值,然後計數器重置為 1。然後對於當前次數超過了最大值,則更新當前最大值,如果等於最大值,則代表出現了相同頻率的數字,加入即可。

如果次數小於最大值,不需要什麼操作。

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var findMode = function(root) {
    let cnt = 0;
    let pre = 0;
    let res = [];
    let maxCnt = 0;
    let handle = (cur) => {
        // 相同的數,累加
        if(cur === pre){
            cnt++;
        }else{
            // 有新數出現,重新置計數器為1,更新新數
            pre = cur;
            cnt = 1;
        }
        // 如果次數超過了最大值,更新當前最大值
        if(cnt > maxCnt){
            maxCnt = cnt;
            res = [cur];
        // 如果有相同頻率的數字出現,直接加入
        }else if(cnt === maxCnt){
            res.push(cur);
        }
    }
    // 二叉搜尋樹,遞迴中序遍歷方式
    let inOrder = (root) =>{
        if(!root) return null;
        inOrder(root.left);
        handle(root.val);
        inOrder(root.right);
    }
    inOrder(root);
    return res;
};

最後

文章產出不易,還望各位小夥伴們支援一波!

往期精選:

小獅子前端の筆記倉庫

leetcode-javascript:LeetCode 力扣的 JavaScript 解題倉庫,前端刷題路線(思維導圖)

小夥伴們可以在Issues中提交自己的解題程式碼,? 歡迎Contributing,可打卡刷題,Give a ⭐️ if this project helped you!

訪問超逸の部落格,方便小夥伴閱讀玩耍~

學如逆水行舟,不進則退

相關文章