Leetcode-标签为Tree 501. Find Mode in Binary Search Tree

来源:互联网 发布:企业优化方案 编辑:程序博客网 时间:2024/06/05 17:13

原题

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)。二叉搜索树的中序遍历恰好为元素的从小到大排序,这样相等的元素一定是相邻的。了解了这个知识点,空间复杂度O(1)就可以做到了。

代码实现

public class Findmodes    {        private int currentVal;        private int currentCount = 0;        private int maxCount = 0;        private int modeCount = 0;        private int[] modeArray;        public int[] FindMode(TreeNode root)        {            preorder(root); //第一遍中序遍历找出出现次数最多的元素数,可能有多个最大            modeArray = new int[modeCount];            modeCount = 0;            currentCount = 0;            preorder(root);            return modeArray;        }        /// <summary>        /// 这种方法只适应于二叉搜索树条件下,查找元素出现的最多次数        /// </summary>        /// <param name="val"></param>        private void getModeValue(int val)        {            if (val != currentVal)            {                currentVal = val;                currentCount = 0;            }            currentCount++;            if (currentCount > maxCount)            {                maxCount = currentCount;                modeCount = 1;            }            else if (currentCount == maxCount)            {                if (modeArray != null) //第二遍遍历后,对出现次数最多的元素                    modeArray[modeCount] = currentVal; //依次赋值给modeArray                modeCount++;            }        }        /// <summary>        /// 二叉搜索树,采取中序遍历对值处理        /// </summary>        /// <param name="root"></param>        private void preorder(TreeNode root)        {            if (root == null)                 return;            preorder(root.left);            getModeValue(root.val);            preorder(root.right);        }    }
2 0