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(1),不少sulotion采用hashmap或者list,如果遇到1,2,3,4...n-1,n,n,n的情况,空间复杂度会变成O(n)。所以应该先得到共有几个modes,再申请空间。代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private int max = 0;
private int currval = 0;
private int currcount = 0;
private int currmodes = 0;
private int[] modes;
public int[] findMode(TreeNode root) {
helper(root);
modes = new int[currmodes];
currcount = 0;
currmodes = 0;
helper(root);
return modes;
}
public void helper(TreeNode root) {
if (root == null) {
return;
}
helper(root.left);
if (root.val != currval) {
currval = root.val;
currcount = 1;
} else {
currcount ++;
}
if (currcount > max) {
max = currcount;
currmodes = 1;
}else if (currcount == max) {
if (modes != null) {
modes[currmodes] = root.val;
}
currmodes ++;
}
helper(root.right);
}
}