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

给定具有重复项的二叉搜索树(BST),找到给定BST中的所有众数(最频繁出现的元素)。

Assume a BST is defined as follows:

假设BST定义如下:

  • 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(n),空间复杂度:O(n)

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     Map<Integer,Integer> map=new HashMap<>();
12     int maxTimes;
13     public int[] findMode(TreeNode root) {
14         if(root==null) return new int[0];
15         inorder(root);
16
17         List<Integer> list=new ArrayList<>();
18         for(int key:map.keySet()){
19             if(map.get(key)==maxTimes)
20                 list.add(key);
21         }
22
23         int[] res=new int[list.size()];
24         for(int i = 0; i<res.length; i++)
25             res[i] = list.get(i);
26         return res;
27     }
28
29     private void inorder(TreeNode node){
30         if(node.left!=null) inorder(node.left);
31         map.put(node.val,map.getOrDefault(node.val,0)+1);
32         maxTimes=Math.max(maxTimes,map.get(node.val));
33         if(node.right!=null) inorder(node.right);
34     }
35 }

方法二:

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     Integer prev=null;
12     int maxTimes=0;
13     int count=1;
14
15     public int[] findMode(TreeNode root) {
16         if(root==null) return new int[0];
17
18         List<Integer> list=new ArrayList<>();
19         inorder(root,list);
20
21         int[] res=new int[list.size()];
22         for(int i=0;i<list.size();i++)
23             res[i]=list.get(i);
24         return res;
25     }
26
27     private void inorder(TreeNode node,List<Integer> list){
28         if(node==null) return;
29         inorder(node.left,list);
30         if(prev!=null){
31             if(node.val==prev)
32                 count++;
33             else
34                 count=1;
35         }
36         if(count>maxTimes){
37             list.clear();
38             list.add(node.val);
39             maxTimes=count;
40         }else if(count==maxTimes){
41             list.add(node.val);
42         }
43         prev=node.val;
44         inorder(node.right,list);
45     }
46 }

详解:

方法一:

哈希表:记录数字和其出现次数之前的映射,变量maxTimes:记录当前最多的次数值(适用于任何寻找众数的树,任意一种遍历方式均可,这里选择中序遍历)

方法二:

题目跟进,不需要额外存储空间,则无法使用哈希表。利用二分搜索树的性质,本身即有序,相同的元素连在一起

prev:相同元素的第一个节点

maxTimes:最大次数

count:当前元素出现次数

原文地址:https://www.cnblogs.com/chanaichao/p/9579293.html

时间: 2024-11-07 16:29:43

132.Find Mode in Binary Search Tree(二分搜索树的众数)的相关文章

[LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二

Given a non-empty binary search tree and a target value, find k values in the BST that are closest to the target. Note: Given target value is a floating point. You may assume k is always valid, that is: k ≤ total nodes. You are guaranteed to have onl

[LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值

Given a non-empty binary search tree and a target value, find the value in the BST that is closest to the target. Note: Given target value is a floating point. You are guaranteed to have only one unique value in the BST that is closest to the target.

[LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 这道题是要求把有序链表转为二叉搜索树,和之前那道Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树思路完全一样,只不过是操作的数据类型有所差别,一个是数组,一个是链表.数组方便就方便在可以通过index直接访问任意一个元

BST(Binary Search Tree)

原文链接:http://blog.csdn.net/jarily/article/details/8679280 1 /****************************************** 2 数据结构: 3 BST(Binary Search Tree),二叉查找树; 4 5 性质: 6 若结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 7 若结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 8 该结点的左.右子树也分别为二叉查找树; 9 10 遍

二叉查找树(binary search tree)

二叉查找树的性质:对于树中的每个节点x,它的左子树中所有项的值不大于x的值,它的右子树中所有项的值不小于x的值. 二叉查找树应具有以下操作 ① 寻找最小项 FIND_MIN ② 寻找最大项 FIND_MAX ③ 是否包含 CONTAINS ④ 树是否为空 IS_EMPTY ⑤ 清空树 MAKE_EMPTY ⑥ 插入节点 INSERT ⑦ 移除节点 REMOVE ⑧ 打印树 PRINT_TREE (中序遍历) ⑨ 深拷贝 DEEP_CLONE 二叉查找树(binary search tree)的抽

[Leetcode][BST][Convert Sorted Array to Binary Search Tree]

把一个排好序的vector转换为一颗二分查找树. 很简单的题目,递归即可,保证边界不要出错. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 1

[Leetcode][BST][Validate Binary Search Tree]

判断一颗树是不是二分查找树,非常经典基础的一个算法. 我很久之前第一次做的时候,是先求出来了树的前序遍历的结果,然后判断这个数组排序后是否和排序前相同,还要判断重复虾米的,很纠结的一种做法. 后来思考了一下怎么用递归的思路做,觉得应该根据定义返回两个子树的最大值和最小值,写了一会代码,发现好麻烦,不太对的样子. 后来看了题解,发现是用了一种反向的思维,把上下界从树的顶端传下去,而不是自下而上的约束.作者太机智了. 1 /** 2 * Definition for binary tree 3 *

【LeetCode】Validate Binary Search Tree 解题报告

今天CSDN博客发生异常,折腾了大半天终于发出了这篇博文. [题目] Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a

【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)

目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中后序遍历,而这篇文章将是在二叉树的基础上来展开讲解的二叉搜索树,也就是说二叉搜索树建立在树的基础之上.至于博主为何要花一整篇文章来讲这个二叉搜索树呢?原因很简单,红-黑树是基于二叉搜索树的,如果对二叉搜索树不了解,那还谈何红-黑树?红-黑树的重要性我想各位没吃过佩奇肉也肯定看过宜春跑....是的,j