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回答

liuyubobobo

2019-07-26

首先,你的Solution肯定是错的。因为提交给Leetcode是WA:

//img1.sycdn.imooc.com/szimg/5d39e7f0096f3c6e05670326.jpg


也就是用这个测试用例

  1
   \
    2


应该返回1和2,你的结果返回的只有1.


我没有仔细执行验证你的逻辑,只是简单看了一下,因为你只有在这个if中,才认为找到了新的众数:

if(curVal == root.val)

这代表当前节点的值和它的父节点一样,但是,如果众数为1,当前节点的值和父亲节点不一样,这个节点的值也是众数(众数为1)

这个逻辑需要改一下。


另外,你给的测试用例,不符合题意。

这个测试用例,是这样的:[1,2,2,3,6,5,8,9,4,4]

//img1.sycdn.imooc.com/szimg/5d39e9e609a82d0005360515.jpg


这不是一棵符合题意的BST:)


继续加油!:)

0
5
慕仰9125617
回复
liuyubobobo
你为何如此优秀,我得用多少年才能像你一样优秀。
2019-07-26
共5条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程