【刷题日记】二叉树-二叉搜索树中的众数-L501-Easy
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
学习点
代码
思路 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public: int val_freq[200001] = {0}; void traverseBST(TreeNode *root) { if (root == nullptr) return; traverseBST(root->left); val_freq[(100000 + root->val)] += 1; traverseBST(root->right); } vector<int> findMode(TreeNode* root) { vector<int> res; traverseBST(root); int max_freq = 0; for (int i = 0; i < 200001; i++) { if (val_freq[i] >= max_freq) { if (val_freq[i] != max_freq) res.clear(); res.push_back(i - 100000); max_freq = val_freq[i]; } } return res; } };
|
思路 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| lass Solution { private: int maxCount = 0; int count = 0; TreeNode* pre = NULL; vector<int> result; void searchBST(TreeNode* cur) { if (cur == NULL) return ;
searchBST(cur->left); if (pre == NULL) { count = 1; } else if (pre->val == cur->val) { count++; } else { count = 1; } pre = cur;
if (count == maxCount) { result.push_back(cur->val); }
if (count > maxCount) { maxCount = count; result.clear(); result.push_back(cur->val); }
searchBST(cur->right); return ; }
public: vector<int> findMode(TreeNode* root) { count = 0; maxCount = 0; pre = NULL; result.clear();
searchBST(root); return result; } };
|