501-Find Mode in Binary Search Tree

kevin聰發表於2018-05-02

Description

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
    /
   2

return [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).


問題描述

給定一個有重複值的二叉排序樹, 找出其所有的模式(最頻繁的值)

假設二叉排序樹如下定義:

  • 左子樹只包含小於等於節點值的節點
  • 右子樹只包含大於等於節點值的節點
  • 左右子樹也為二叉排序樹

問題分析

進行兩次中序遍歷, 第一次獲取模式個數(用來建立陣列)以及次數, 第二次往陣列裡面存值


解法

public class Solution {
    private int currVal;
    //當前值的個數
    private int currCount = 0;
    //當前最大個數
    private int maxCount = 0;
    //模式個數
    private int modeCount = 0;
    private int[] modes;

    public int[] findMode(TreeNode root) {
        inorder(root);
        //注意這裡
        modes = new int[modeCount];
        //注意, 沒有重置maxCount
        modeCount = 0;
        currCount = 0;
        inorder(root);
        return modes;
    }

    private void handleValue(int val){
        if(val != currVal){
            currVal = val;
            currCount = 0;
        }
        currCount++;
        if(currCount > maxCount){
            maxCount = currCount;
            modeCount = 1;
        }else if(currCount == maxCount){
            if(modes != null)   modes[modeCount] = currVal;
            modeCount++;
        }
    }

    private void inorder(TreeNode root){
        if (root == null) return;

        inorder(root.left);
        handleValue(root.val);
        inorder(root.right);
    }
}

相關文章