题目:
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()
哦