谷歌面试题

本文探讨了如何在二叉查找树中找出出现频率最高的元素,通过中序遍历并利用有序序列特性进行统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【谷歌面试题】找出二叉查找树中出现频率最高的元素


找出二叉查找树中出现频率最高的元素。树中结点满足left->val <= root->val <= right->val。如果多个元素出现次数相等,返回最小的元素。

在一个有序数组中,我们查找出现频率最高的元素,很简单,顺序扫描一遍即可统计出。那么我们对二叉查找树也可以用类似方式统计,因为中序遍历序列就是有序序列,所以我们在中序遍历的过程中就可以统计出出现频率最高的元素。

[cpp]  view plain copy
  1. class TreeNode  
  2. {  
  3. public:  
  4.     int val;  
  5.     TreeNode *left;  
  6.     TreeNode *right;  
  7.     TreeNode(int val, TreeNode* left = NULL, TreeNode *right = NULL)  
  8.     {  
  9.         this->val = val;  
  10.         this->left = left;  
  11.         this->right = right;  
  12.     }  
  13. };  
  14.   
  15. int GetMostFrequently(TreeNode * root)  
  16. {  
  17.     void _GetMostFrequently(TreeNode *root, int & current, int & currentFrequency,   
  18.                 int & maxFrequency, int & mostFrequently);  
  19.     if(root == NULL)  
  20.         throw new invalid_argument("Can't be a NULL tree");  
  21.     int mostFrequently = INT_MAX;  
  22.     int current = INT_MAX;  
  23.     int currentFrequency = 0;  
  24.     int maxFrequency = 0;  
  25.     _GetMostFrequently(root, current, currentFrequency, maxFrequency, mostFrequently);  
  26.     return mostFrequently;  
  27. }  
  28.   
  29. void _GetMostFrequently(TreeNode *root, int & current, int & currentFrequency,   
  30.             int & maxFrequency, int & mostFrequently)  
  31. {  
  32.     if(root == NULL)  
  33.         return;  
  34.     _GetMostFrequently(root->left, current, currentFrequency,   
  35.                 maxFrequency, mostFrequently);  
  36.     if(root->val == current)  
  37.         ++currentFrequency;  
  38.     else  
  39.     {  
  40.         current = root->val;  
  41.         currentFrequency = 1;  
  42.     }  
  43.     if(currentFrequency > maxFrequency)  
  44.     {  
  45.         maxFrequency = currentFrequency;  
  46.         mostFrequently = current;  
  47.     }  
  48.     _GetMostFrequently(root->right, current, currentFrequency,   
  49.                 maxFrequency, mostFrequently);  
  50. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值