501. Find Mode in Binary Search Tree(python+cpp)

题目:

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).

解释:
返回BST中出现次数最多的数,对BST中序遍历即可,不需要中序遍历完成后再求众数,直接在遍历的过程中更新结果。(先遍历完成的解法是需要额外的空间的),但是需要很多额外的全局变量记录一些值。
python代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def findMode(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        self.result=[]
        self.max_count=0
        self.tmp_count=0
        self.tmp_val=None
        def mid(root):
            if root.left:
                mid(root.left)
            if self.result==[]:
                self.result=[root.val]
                self.tmp_count=1
                self.max_count=1
            else:
                if root.val==self.tmp_val:
                    self.tmp_count+=1
                    if self.tmp_count>self.max_count:
                        self.result=[self.tmp_val]
                        self.max_count=self.tmp_count
                    elif self.tmp_count==self.max_count:
                        self.result.append(self.tmp_val)  
                else:
                    self.tmp_count=1
                    if self.tmp_count==self.max_count:
                        self.result.append(root.val)
            self.tmp_val=root.val
            if root.right:
                mid(root.right)
        if root:
            mid(root)
        return self.result

c++代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int tmp_val=NULL;
    int tmp_count=0;
    vector<int>result;
    int max_count=0;
    
    vector<int> findMode(TreeNode* root) {
        if (root)
            mid(root);
        return result;
    }
    void mid(TreeNode* root)
    {
        if(root->left)
            mid(root->left);
        if (result.size()==0)
        {
            result={root->val};
            tmp_count=1;
            max_count=1;
        }
        else
        {
            if(root->val==tmp_val)
            {
                tmp_count++;
                if (tmp_count>max_count)
                {
                    result={tmp_val};
                    max_count=tmp_count;
                }
                else if(tmp_count==max_count)
                    result.push_back(tmp_val);
            }
            else
            {
                tmp_count=1;
                if(tmp_count==max_count)
                    result.push_back(root->val);
            }
        }
        tmp_val=root->val;
        if(root->right)
            mid(root->right);
    }
};

总结:
注意在遍历的过程中如果当前的个数大于最大值,那么可以直接把result变成{tmp_val},对于数组的更新不仅仅只有append()/push_back()

你可能感兴趣的:(LeetCode)