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 / 2return
[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).
二叉搜索树中的众数。题意是给一个类似二叉树的树,其中的节点值并不是unique的,可以有相等的,但是总体来讲是遵循左子树 <= 根节点 <= 右子树的。请输出二叉搜索树中的众数,也就是出现次数最多的节点。注意节点个数有可能不止一个。
涉及到二叉搜索树的题目,十有八九需要利用到中序遍历。这道题也不例外,在中序遍历过程中,你会得到一个升序的数组。但是如何在不用hashmap的情况下统计众数的出现次数呢?我们可以用一个变量maxcount记录到目前为止最大的出现次数。遍历树的时候,如果当前这个节点的出现次数是最大的,就把他加入结果集;如果有多个元素的出现次数都是最大的,则也把他们一一加入结果集。但是当有一个元素的出现次数更大的时候,需要将结果集清空并放入这个当前出现次数最大的元素。注意33行清空list的这个动作的时间复杂度是O(n)。
时间O(n) - list的清空操作暂时忽略不计,这个操作原则上是O(n)级别的
空间O(n) - output是个list
Java实现
1 class Solution { 2 Integer prev = null; 3 int count = 1; 4 int max = 0; 5 6 public int[] findMode(TreeNode root) { 7 if (root == null) { 8 return new int[0]; 9 } 10 List<Integer> list = new ArrayList<>(); 11 traverse(root, list); 12 int[] res = new int[list.size()]; 13 for (int i = 0; i < list.size(); i++) { 14 res[i] = list.get(i); 15 } 16 return res; 17 } 18 19 private void traverse(TreeNode root, List<Integer> list) { 20 if (root == null) { 21 return; 22 } 23 traverse(root.left, list); 24 if (prev != null) { 25 if (root.val == prev) { 26 count++; 27 } else { 28 count = 1; 29 } 30 } 31 if (count > max) { 32 max = count; 33 list.clear(); 34 list.add(root.val); 35 } else if (count == max) { 36 list.add(root.val); 37 } 38 prev = root.val; 39 traverse(root.right, list); 40 } 41 }