原题:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/
参考题解:力扣官方题解
给定一个有相同值的二叉搜索树(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 中序遍历的性质: BST 的中序遍历序列是一个非递减的有序序列。
思路:
中序遍历bst,也就是扫过了一个非降序的序列。
在其中找出现次数最多的数据,用变量fa记录前一个数据,res记录当前出现最多次数,vector<int>v里面装上对应数据。
出现的问题:
vector的clear操作不能够清除内存
解决方法:
v=vector<int>{val};//将v变成了只含有数据val的vector
代码
1 void zxbl(TreeNode* root, int &fa, int &num, int&res, vector<int>&v){ 2 if(root->left!=NULL){//先左子节点 3 zxbl(root->left, fa, num, res, v); 4 } 5 // cout<<root->val<<endl; 6 int val=root->val;//再根节点 7 if(val==fa){ 8 num++; 9 }else{ 10 num=1; 11 } 12 if(num==res&&count(v.begin(), v.end(), val)==0) v.push_back(val);//如果出现次数相同放进v 13 else if(num>res){//次数更多取而代之 14 v=vector<int>{val};//清内存空间 15 res=num; 16 } 17 18 fa=val; 19 if(root->right!=NULL){//最后右子节点 20 zxbl(root->right, fa, num, res, v); 21 } 22 } 23 24 25 vector<int> findMode(TreeNode* root) { 26 vector<int>v; 27 int res=0, fa=-1, num=0; 28 if(root==NULL) return v; 29 zxbl(root, fa, num, res, v);//中序遍历 30 return v; 31 }
原文:https://www.cnblogs.com/sloth612/p/13726907.html