力扣501题 解题思路和步骤 C++代码实现,力扣(leetcode)

贾蔷
• 阅读 44

力扣501题 解题思路和步骤 C++代码实现,力扣(leetcode)

问题背景及描述

力扣501题要求我们找出在一个二叉搜索树(BST)中的众数。二叉搜索树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何节点,且小于其右子树中的任何节点。众数是指在BST中出现次数最多的值。

解题思路分析

解题的关键在于理解BST的性质以及如何高效地遍历树以找到众数。由于BST的特性,我们可以采用中序遍历(In-order Traversal),这样可以得到一个有序的节点值序列。我们可以通过统计每个值出现的次数来确定众数。

算法步骤

对BST进行中序遍历,将节点值存储在一个数组中。 遍历数组,统计每个值的出现次数。 比较出现次数,找出出现次数最多的值。 如果有多个值出现次数相同且为最大次数,返回所有这些值。

C++代码实现

public:
    vectorfindMode(TreeNode root) {
        vectormodes;
        unordered_mapcount;
        inOrder(root, count);
        int maxCount = 0;
        for (auto& kv : count) {
            if (kv.second > maxCount) {
                maxCount = kv.second;
            }
        }
        for (auto& kv : count) {
            if (kv.second == maxCount) {
                modes.push_back(kv.first);
            }
        }
        return modes;
    }

    void inOrder(TreeNode node, unordered_map& count) {
        if (!node) return;
        inOrder(node->left, count);
        count[node->val]++;
        inOrder(node->right, count);
    }
};

案例分析

假设我们有一个BST,其节点值如下:[1,2, 3]。中序遍历结果为[1,2, 3],显然没有众数。但如果BST的节点值为[1,2, 2],中序遍历结果为[1,2, 2],众数为2,因为它出现了两次,比其他任何值都多。

通过上述分析和代码实现,我们可以看到,解决力扣501题的关键在于理解BST的性质和中序遍历的特点,以及如何利用哈希表高效统计节点值的出现次数。这种方法不仅适用于找到BST中的众数,也可以推广到其他需要统计元素出现次数的场景。

原文:https://www.dajuwangluo.cn/list/40.html

点赞
收藏
评论区
推荐文章
22 22
4年前
动图图解二叉查找树的基本原理及其实现
本文为系列专题的第12篇文章。1.2.3.4.5.6.7.8.9.10.1.是什么?二叉查找树(BinarySearchTree)必须满足以下特点:若左子树不为空,则左子树的所有结点值皆小于根结点值若右子树不为空,则右子树的所有结点值皆大于根结点值左右子树也是二叉排序树如下图,是一颗二叉查找树:如果你对二叉查找树进行中序
Kubrnete Kubrnete
4年前
二叉树题集(持续更新中)
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。1\.求二叉搜索树最大深度输入格式:输入给出一行整数序列作为二叉搜索树的键值,数字间以空格分隔,输入0结束(0不计入该二叉树键值)。输入样例:8685109110输出样例:4常规的求二叉搜索树深度的做法是递
Wesley13 Wesley13
3年前
B树与B+树的区别?
1.B树简介B树是一种多路平衡搜索树。它由二叉树变换而来的。定义如下:1.1每个节点最多有m1个关键字1.2根节点最少有1个关键字1.3非根节点至少有m/2个关键字1.4每个节点的关键字都是按照从小到大的顺序排列,每个关键字的左子树中的关键字都小于它,而右子树中所有关键字都大于它。1.5所有的叶子节点都处于同
Wesley13 Wesley13
3年前
JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树基础理论首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。先序遍历为:根节点左子树右子树中序遍历为:左子树根节点右子树后序遍历为:左子树右子树根节点(只要记住根节点在哪里就是什么遍历,且都是先左再右)线索化现在有这么一棵二叉树,它的数据结
Stella981 Stella981
3年前
LeetCode(98): 验证二叉搜索树
Medium!题目描述:给定一个二叉树,判断其是否是一个有效的二叉搜索树。一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/\
Wesley13 Wesley13
3年前
PHP数据结构与算法:二叉树
一、定义二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(leftsubtree)和“右子树”(rightsubtree)。二、特性1.在二叉树的第i层上至多有2^(i1)个结点(i0)2.深度为k的二叉树至多有2^k1个结点(k0)3.对于任意一棵二叉树,如果其叶结点数为N0,而
Stella981 Stella981
3年前
LeetCode初级算法之树:98 验证二叉搜索树
01题目信息题目地址:https://leetcodecn.com/problems/validatebinarysearchtree/给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。
Wesley13 Wesley13
3年前
98. 验证二叉搜索树
题目描述给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。输入:5/\14 /\ 
菜园前端 菜园前端
2年前
什么是二叉树?
原文链接:什么是二叉树?树中每个节点最多只能有两个子节点,在JavaScript中一般都是通过Object来模拟二叉树。常用操作前序遍历中序遍历后序遍历前序遍历根左右。口诀:1.访问根节点2.对根节点的左子树进行前序遍历3.对根节点的右子树进行前序遍历通过
贾蔷 贾蔷
1星期前
力扣145题:二叉树的后序遍历, 解题思路与C++实现
题目介绍力扣第145题要求实现一个函数,该函数接收一个二叉树的根节点,并返回该树的后序遍历结果。后序遍历是一种遍历二叉树的算法,其顺序为:先遍历左子树,是右子树,是根节点。解题思路分析解题时,我们可以使用递归或迭代的方法。递归方法较为直观,但可能导致栈溢出