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).
因为这道题左子节点可能等于根节点和右子节点,宜使用中序遍历求解。此外,这道题限制空间复杂度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); }}
新闻热点
疑难解答