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

原题

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

题目分析

求解二叉搜索树中出现次数最多的元素,答案的空间复杂度为 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值