701. 二叉搜索树中的插入操作-day18

由于二叉搜索树的中序遍历序列是单调递增的,因此二叉搜素树的中序遍历序列中的相同结点值一定相邻。只要得到二叉搜索树的中序遍历序列,即可得到每个结点值的出现次数,并得到众数。

使用递归实现中序遍历的做法是依次访问左子树、根结点和右子树,对于左子树和右子树使用同样的方法访问。

由于中序遍历序列中的相同结点值一定相邻,因此不需要存储完整的中序遍历序列,而是只需要存储上一个遍历到的结点值和出现次数。每次访问结点时,判断当前结点值和上一个结点值是否相等,更新当前结点值的出现次数,然后比较当前结点值的出现次数与最大出现次数,维护二叉搜索树中的众数。

如果当前结点值的出现次数等于最大出现次数,则将当前结点值添加到众数列表中。

如果当前结点值的出现次数大于最大出现次数,则将最大出现次数更新为当前结点值的出现次数,将众数列表清空后将当前结点值添加到众数列表中。

遍历结束之后,众数列表中的结点值即为二叉搜索树中的全部众数。

对于中序遍历序列中的任意两个相邻结点值,或者结点值不同,或者结点值相同且出现次数不同,因此同一个结点值最多在众数列表中出现一次,不会重复出现。
参考storm大神
`class Solution {
int prev;
int freq;
int maxFreq;
List modesList;

public int[] findMode(TreeNode root) {
    prev = Integer.MIN_VALUE;
    freq = 0;
    maxFreq = 0;
    modesList = new ArrayList<Integer>();
    inorder(root);
    int size = modesList.size();
    int[] modes = new int[size];
    for (int i = 0; i < size; i++) {
        modes[i] = modesList.get(i);
    }
    return modes;
}

public void inorder(TreeNode node) {
    if (node == null) {
        return;
    }
    inorder(node.left);
    if (node.val == prev) {
        freq++;
    } else {
        prev = node.val;
        freq = 1;
    }
    if (freq == maxFreq) {
        modesList.add(node.val);
    } else if (freq > maxFreq) {
        maxFreq = freq;
        modesList.clear();
        modesList.add(node.val);
    }
    inorder(node.right);
}

}
`

posted @ 2026-03-15 20:05  大头海绵宝宝  阅读(2)  评论(0)    收藏  举报