首页 > 其他 > 详细

二叉搜索树中序遍历-力扣501

时间:2020-09-24 23:09:57      阅读:56      评论:0      收藏:0      [点我收藏+]

原题: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 }

 

二叉搜索树中序遍历-力扣501

原文:https://www.cnblogs.com/sloth612/p/13726907.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!