1. 程式人生 > >[leetcode: Python]501. Find Mode in Binary Search Tree

[leetcode: Python]501. 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).

方法一:129ms

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

class Solution(object):
    def findMode(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
counter = collections.Counter() def traverse(root): if not root: return counter[root.val] += 1 traverse(root.left) traverse(root.right) traverse(root) maxn = max(counter.values()+[None]) return [e for e, v in counter.iteritems() if v == maxn]

方法二:96ms

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

class Solution(object):
    def findMode(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return []
        count = collections.defaultdict(int)
        def preorder(root):
            if root:

                count[root.val] += 1
                preorder(root.left)
                preorder(root.right)
        preorder(root)
        max_occ = max(count.values())
        return [k for k in count if count[k] == max_occ]