LeetCode501号题关于二分搜索树众数的问题
来源:7-8 映射的复杂度分析和更多映射相关问题

慕仰9125617
2019-07-25
bobo老师,今天我在刷leetcode501号题目(https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/)的时候遇到一个问题。
首先摆上我的Solution:
class Solution {
List<Integer> list = new ArrayList<>();
Integer maxCount = 0;
Integer curCount = null;
Integer curVal = 0;
public int[] findMode(TreeNode root) {
find(root);
int[] arr = new int[list.size()];
for(int i = 0; i< list.size(); i++){
arr[i] = list.get(i);
}
return arr;
}
public void find(TreeNode root){
if(root == null){
return;
}
find(root.left);
if(curCount == null){
maxCount = curCount = 0;
curVal = root.val;
list.add(curVal);
} else {
if(curVal == root.val){
curCount ++;
if(curCount == maxCount){
list.add(curVal);
} else if(curCount > maxCount){
maxCount = curCount;
list.clear();
list.add(curVal);
}
} else {
curVal = root.val;
curCount = 0;
}
}
find(root.right);
}
}
将该Solution放到leetCode,测试用例使用默认的[1,null,2,2]进行提交的时候,结果正确。
这时候我觉得测试用例太简单,将测试用例改成这样[1,2,2,3,6,5,8,9,4,4],发现出现错误:
这时我就怀疑是不是我的Solution写错了。于是我在我本地写了一个TreeNode的实现,进行Solution的验证,TreeNode代码如下:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(){}
TreeNode(int x) { val = x; }
/**
* 添加数据
* @param val
*/
public void add(int val) {
add(this, val);
}
public TreeNode add(TreeNode node, int val){
if(node == null){
return new TreeNode(val);
}
//将等于的情况优先放到为空的孩子节点上,否则按照 左孩子-右孩子 的顺序插入
if(val == node.val && node.left == null)
node.left = add(node.left, val);
else if(val == node.val && node.right == null)
node.right = add(node.right, val);
else if(val < node.val)
node.left = add(node.left, val);
else if(val > node.val)
node.right = add(node.right, val);
return node;
}
/**
* 中序遍历
*/
public void inOrder(){
inOrder(this);
}
public void inOrder(TreeNode node){
if(node == null){
return;
}
inOrder(node.left);
System.out.println(node.val);
inOrder(node.right);
}
}
然后写了如下Main方法进行测试:
public static void main(String[] args) {
TreeNode bst = new TreeNode(1);
bst.add(2);
bst.add(2);
bst.add(3);
bst.add(6);
bst.add(5);
bst.add(8);
bst.add(9);
bst.add(4);
bst.add(4);
System.out.println("-------------中序遍历------------");
bst.inOrder();
Solution solution = new Solution();
int[] arr = solution.findMode(bst);
System.out.println("-------------众数结果------------");
for(int i = 0; i<arr.length; i++)
System.out.println(arr[i]);
}
打印结果如下所示:
到此我认为我的Solution的没问题的。但是Leetcode的验证结果使我有点头疼,是由于LeetCode的TreeNode的实现方法造成的,还是我理解的有点偏差,望bobo老师指点一点。
1回答
-
首先,你的Solution肯定是错的。因为提交给Leetcode是WA:
也就是用这个测试用例
1 \ 2
应该返回1和2,你的结果返回的只有1.
我没有仔细执行验证你的逻辑,只是简单看了一下,因为你只有在这个if中,才认为找到了新的众数:
if(curVal == root.val)
这代表当前节点的值和它的父节点一样,但是,如果众数为1,当前节点的值和父亲节点不一样,这个节点的值也是众数(众数为1)
这个逻辑需要改一下。
另外,你给的测试用例,不符合题意。
这个测试用例,是这样的:[1,2,2,3,6,5,8,9,4,4]
这不是一棵符合题意的BST:)
继续加油!:)
052019-07-26
相似问题