Find Mode in Binary Search Tree 寻找二叉搜索树的众数

Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred element) in the given BST.

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than or equal to the node's key.
  • The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
  • Both the left and right subtrees must also be binary search trees.

For example:
Given BST [1,null,2,2],

   1
    \
     2
    /
   2

return [2].

Note: If a tree has more than one mode, you can return them in any order.

Follow up: Could you do that without using any extra space? (Assume that the implicit stack space incurred due to recursion does not count).

思路:

这道题如果允许用O(n)的空间复杂度就容易很多,可以用哈希表来做节点值(key),节点值出现的次数(value),最后在哈希表中寻找value最大的key即是答案。

为了实现O(1)的空间复杂度,且考虑到是二叉搜索树,所以采用中序遍历便可以得到由小到大的排序,存储pre上一个节点的值,如果pre不为空(非首节点)则通过cur统计连续出现相同数字的次数,如果次数等于max(历史出现最大数字对应的次数),数字就放到res中,大于max就说明找到了更大的数字对应的数字,则把res清空,数字放入res中,更新max。

这道题要注意的细节很多,初始化时cur为1,不能为0,因为考虑到头结点的问题,如下图(debug就知道为什么要初始化为1了,正确输出为1,2,初始化为0会输出2):

  1
    \
     2

代码如下:

   void findModeCore(TreeNode* root, TreeNode* &pre, int &cur,  int &max_, vector<int> &res) {
	   if (!root) {
		   return;
	   }
	   findModeCore(root->left, pre, cur, max_,res);
	   if (pre) {
		   cur = (root->val == pre->val) ? (cur+1) : 1;		   
	   }
       if (cur >= max_) {
			   if (cur == max_) {
				   res.push_back(root->val);
			   }
			   else {
				   res.clear();
				   res.push_back(root->val);
				   max_ = cur;
			   }
           
		   }
	   pre = root;
	   findModeCore(root->right, pre, cur, max_, res);
   }
   vector<int> findMode(TreeNode* root) {
	   vector<int> res;
	   if (!root) {
		   return res;
	   }
	   TreeNode* pre = nullptr;
	   int cur = 1;
	   int max_ = 0;
	   findModeCore(root, pre, cur, max_, res);
	   return res;
   }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值