【亡羊補牢】挑戰資料結構與演算法 第39期 LeetCode 501. 二叉搜尋樹中的眾數(二叉樹)
仰望星空的人,不應該被嘲笑
題目描述
給定一個有相同值的二叉搜尋樹(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!
訪問超逸の部落格,方便小夥伴閱讀玩耍~
學如逆水行舟,不進則退
相關文章
- 【亡羊補牢】挑戰資料結構與演算法 第51期 LeetCode 102. 二叉樹的層序遍歷(二叉樹)資料結構演算法LeetCode二叉樹
- Leetcode刷題筆記 501. 二叉搜尋樹中的眾數LeetCode筆記
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- 【資料結構】【二叉樹】四、二叉搜尋樹的特性(不斷補充)資料結構二叉樹
- 資料結構-二叉搜尋樹資料結構
- 【資料結構】二叉搜尋樹!!!資料結構
- Day21 | 530.二叉搜尋樹的最小絕對差、501.二叉搜尋樹中的眾數 、236. 二叉樹的最近公共祖先二叉樹
- 資料結構☞二叉搜尋樹BST資料結構
- 資料結構之「二叉搜尋樹」資料結構
- 程式碼隨想錄演算法訓練營第18天| 530.二叉搜尋樹的最小絕對差, 501.二叉搜尋樹中的眾數 , 236. 二叉樹的最近公共祖先演算法二叉樹
- Leedcode-二叉搜尋樹中的眾數
- 二叉搜尋樹的結構
- 資料結構-二叉搜尋樹的實現資料結構
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 【資料結構與演算法】二叉搜尋樹的簡單封裝資料結構演算法封裝
- 程式碼隨想錄演算法訓練營day18 |530.二叉搜尋樹的最小絕對差 501.二叉搜尋樹中的眾數 236. 二叉樹的最近公共祖先演算法二叉樹
- LeetCode 95 | 構造出所有二叉搜尋樹LeetCode
- LeetCode-230-二叉搜尋樹中第K小的元素LeetCode
- Leetcode230. 二叉搜尋樹中第K小的元素LeetCode
- 二叉搜尋樹的第 k 個結點
- 資料結構和演算法-Go實現二叉搜尋樹資料結構演算法Go
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- 資料結構之二叉搜尋樹—Java實現資料結構Java
- 程式碼隨想錄演算法訓練營第十七天|leetcode654. 最大二叉樹、leetcode617.合併二叉樹、leetcode700.二叉搜尋樹中的搜尋、leetcode98.驗證二叉搜尋樹演算法LeetCode二叉樹
- 程式碼隨想錄day18 || 530 二叉搜尋樹最小差,501 二叉搜尋樹眾數,236 二叉搜尋樹最近公共祖先
- 《戀上資料結構與演算法》筆記(九):二叉搜尋樹 II資料結構演算法筆記
- 【資料結構與演算法】二叉樹資料結構演算法二叉樹
- 程式碼隨想錄演算法訓練營第第20天 | 654.最大二叉樹 、617.合併二叉樹 、700.二叉搜尋樹中的搜尋、98.驗證二叉搜尋樹演算法二叉樹
- 資料結構(樹):二叉樹資料結構二叉樹
- leetcode 700. 二叉搜尋樹中的搜尋 思考分析LeetCode
- 資料結構高階--二叉搜尋樹(原理+實現)資料結構
- 資料結構:一文看懂二叉搜尋樹 (JavaScript)資料結構JavaScript
- LeetCode-096-不同的二叉搜尋樹LeetCode
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- 二叉搜尋樹
- 看圖輕鬆理解資料結構與演算法系列(二叉搜尋樹)資料結構演算法
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹