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;
       }
---------------------
作者:麦田里的哈士奇
来源:CSDN
原文:https://blog.csdn.net/qq_26410101/article/details/80484278
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-07-28 17:44  天涯海角路  阅读(106)  评论(0)    收藏  举报