原题链接:https://leetcode.cn/problems/find-mode-in-binary-search-tree/
这个题中的树是含有重复值的二叉搜索树,这一点很重要,二叉搜索树的中序遍历结果是有序的(升序),这个题的返回结果是一个数组,题目要求是最好不使用额外空间(返回数组的空间和递归产生的隐式调用栈的开销不被计算在内)。
这个题不算难,但是还是要注意一下:结点之间最大出现频率的结点的数量可以一样多。
思路:
肯定是需要中序遍历的,而且要求出遍历到当前结点的前一个结点,比较重复出现次数最多的结点,结点之间最大出现频率的结点的数量可以一样多。
代码:(核心代码)
class Solution {
public:
TreeNode *pre = NULL; //保存遍历到的当前结点的前一个结点
int count = 1; //当前结点出现的频数
int maxcout = 1; //结点最大出现的频数
vector<int>path; //保存最大出现频率的结点的值
//中序遍历
void dfs(TreeNode *root,vector<int>&path)
{
if(!root) return;
dfs(root->left,path);
if(pre)
{
if(pre->val == root->val) count++;//前后两个结点的值相同
else count = 1;//前后两个结点的值不相同
}
//root结点的前一个结点
pre = root;
if(count == maxcout)
{
path.push_back(pre->val);
}
//如果出现的更大的出现频率的结点,要更新数组里面的值
if(count > maxcout)
{
path.clear();
path.push_back(pre->val);
maxcout = count;
}
dfs(root->right,path);
}
vector<int> findMode(TreeNode* root) {
pre = NULL;
count = 1;
maxcout = 1;
path.clear();
dfs(root,path);
return path;
}
};