每日一题:leetcode173.二叉搜索树迭代器

题目描述

在这里插入图片描述

题目分析

更加地觉得编程重要的不在于如何写代码,用什么具体的技巧,编码本身只是一种将思维呈现的方式,但是如果思维是不清晰的,那么就算懂得再多的编码的奇技淫巧也是没有什么帮助的。相反,如果有一个清晰的思路,便能很轻松的写出优雅的代码。最近在看《编程大师访谈》,感觉很多大师都提到的一个思想:编程最重要的是数学而不是代码本身。他们觉得本科教育完全不应该接触计算机,而是应该学习数学、历史等知识。我刚进大学的时候觉得学习高数、大学物理没有丝毫意义,现在慢慢觉得那些知识对思维的训练的重要程度比什么所谓的专业课重要的多。

大概花了二十分钟做这道题,觉得最后的实现方式还是比较优美的。

其实题目要求的就是二叉搜索树的中序遍历,但是显然不能使用递归的方式,因此一个栈是必须的,用一个指针指向当前返回的值。

通过对中序遍历的模拟可以发现,任何时候这个指针都在指向一个子树的最左侧的节点。而下一个位置在其右子树的最左侧节点。如果没有右子树则返回栈中的下一个节点,该节点是当前节点最近的没有访问过的祖先。

总结一下:对于当前节点,我们不用访问他的左子树,因为它的左子树要么为空要么已经访问,我们会访问他的右子树,如果没有右子树则返回栈中的下一个节点。如果栈为空则返回空指针表示遍历结束

问题在于我们什么时候入栈呢,正是在搜索一个子树最左侧节点的时候将其路径上的节点全部入栈,记录当前节点的所有祖先,最后再依次访问。

class BSTIterator {
public:BSTIterator(TreeNode* root) {iter = find_min(root);}int next() {int ret = iter->val;if (iter->right != nullptr) {iter = find_min(iter->right);} else {if (!stk.empty()) {iter = stk.top();stk.pop();} else {iter = nullptr;}}return ret;}bool hasNext() {return iter != nullptr;}
private:stack<TreeNode *> stk; //保存根节点栈TreeNode *iter;TreeNode *find_min(TreeNode *root) {if (root == nullptr) return root;while (root->left != nullptr) {stk.push(root);root = root->left;}return root;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04 Clion/Pycharm/IDEA 输入中文+光标跟随解决方案

ibus输入法&#xff08;弃用&#xff09; 之前一直用的搜狗输入法&#xff0c;但是搜狗输入法无法在Jetbrains全家桶下使用&#xff0c;但是又需要输入中文&#xff0c;没有办法我只能下载了谷歌输入法&#xff0c;十分难用&#xff0c;但是也没有其他办法&#xff0c;经常到网…

leetcode11.盛最多水的容器

题目描述 题目分析 看到题目后第一个想法当然是O(n2)O(n^2)O(n2)的&#xff0c;但是数据范围是3e4&#xff0c;应该会超时&#xff0c;而且这种数据范围也不是让暴力求解的 。 相当于求解∑i<jmax((j−i)∗min(a[i],a[j]))\sum_{i<j}{max((j-i)*min(a[i],a[j]))}∑i<…

每日一题:leetcode190.颠倒二进制位

题目描述 题目分析 题目本身很简单&#xff0c;没觉得有什么技巧可以再进行优化了&#xff0c;觉得位运算是无法打乱相对顺序的&#xff0c;而这里需要进行镜像颠倒的操作。因此就踏实地写了一个循环。 在使用位运算得到每一位的时候&#xff0c;我吸取了经验&#xff0c;用一…

结构屈曲分析

结构屈曲分析主要用于判定结构受载后是否有失稳风险&#xff0c;作为工程应用&#xff0c;一般分为线性屈曲分析和非线性屈曲分析。 线性屈曲分析需要具备较多的前提条件&#xff0c;如载荷无偏心、材料无缺陷等&#xff0c;在实际工程应用中结构制作过程和加载方式很难达到线性…

每日一题:leetcode74.搜索二维矩阵

题目描述 题目分析 感觉这是一个放错标签的简单题。题目非常简单&#xff0c;思路应该很明确是二分&#xff0c;我很快写了一个&#xff08;虽然不小心把!打成调试了一会&#xff09;。 class Solution { public:bool searchMatrix(vector<vector<int>>& mat…

每日一题:leetcode90.子集贰

题目描述 题目分析 感觉这道题让自己对枚举排列有了一个更好的认识&#xff0c;感觉自己的这种思路不错。 假设没有重复元素&#xff08;退化成78.子集&#xff09;&#xff0c;我们应该怎么做&#xff1f;初始的时候幂集中只有一个空集&#xff0c;然后对每个元素&#xff0…

每日一题:leetcode1006.笨阶乘

题目描述 题目分析 因为顺序一定且没有括号&#xff0c;所以逻辑很简单。我们要顺序处理的矛盾在于&#xff0c;减号后面会再出现乘法和除法&#xff0c;我们不妨将对乘法和除法用一个临时值进行计算&#xff0c;计算结束后再合并到值里面&#xff0c;一般来讲乘法和除法的处理…

每日一题:leetcode80.删除有序数组中的重复元素贰

题目描述 题目分析 又是一道贴错标签的简单题&#xff0c;很明显的双指针&#xff0c;我的做法是用两个变量保存是否需要记录&#xff0c;官方题解的做法是直接判断&#xff0c;人家的高明一些 class Solution { public:int removeDuplicates(vector<int>& nums) {…

每日一题:leetcode81.搜索旋转排序数组Ⅱ

题目描述 题目分析 不含重复元素的题解&#xff08;leetcode33&#xff09; 这道题也是我们算法课的一道编程题&#xff0c;写完以后发现当时的思路和现在没有什么变化&#xff0c;果然是自己啊。我的想法是先判断区间整体是升序的还是旋转的&#xff0c;如果是升序的就按照正…

C++ JSON库:JSON for Morden C++

绪论 最近因为项目的需要&#xff0c;需要对JSON进行一定的数据处理&#xff0c;因为想要用C进行编码&#xff0c;便对C的JSON库进行的调研&#xff0c;发现这个库比较好用&#xff1a;JSON for Morder C。 使用指南 想要使用这个json库&#xff0c;只需要在源文件中包含jso…

Linux信号实现精确到微秒的sleep函数:通过sigsuspend函数解决时序竞态问题

原理就是先使用定时器定时&#xff0c;然后再使用pause函数或者sigsuspend函数主动阻塞挂起&#xff0c;最终恢复现场。 如果使用pause函数的话&#xff0c;优点是使用简单&#xff0c;缺点是有可能产生时序竞态&#xff0c;导致进程一直阻塞下去&#xff1a;在定时和挂起之间…

Linux创建多个子进程并通过捕获SIGCHLD信号进行非阻塞回收

我们通过fork函数创建多个子进程&#xff0c;并通过exec函数族在子进程中进行其他的工作&#xff0c;但是为了避免僵尸进程&#xff0c;我们要对子进程进行回收。常用的回收方式是wait或者waitpid进行阻塞回收&#xff0c;因为如果非阻塞回收很难把握时机&#xff0c;而阻塞回收…

Linux创建守护进程

守护进程&#xff08;Daemon&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务&#xff0c;不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过…

Linux创建多个子线程并回收

创建子线程的逻辑相比子进程要更容易理解一些&#xff0c;因为线程没有像进程那样复制很多东西另起炉灶&#xff0c;子线程从传入的开始函数开始运行&#xff0c;但是难点在于传入参数和回收时获取退出状态&#xff0c;因为这两个原本都是void *类型的&#xff0c;而我们在使用…

Qt发布程序

Windows&#xff1a; https://www.cnblogs.com/linuxAndMcu/p/10974927.html Ubuntu&#xff1a; https://blog.csdn.net/u014779536/article/details/107854060

K210入门

之前购买了一个Sipeed Maix M1w Dock k210的开发板&#xff0c;想着自己鼓捣鼓捣&#xff0c;在网上看到了一些好的教程&#xff0c;在这里记录一下&#xff1a; 嵌入式AI从入门到放肆【K210篇】-- 硬件与环境&#xff1a;介绍了各种开发环境的搭建&#xff0c;但是不是特别详细…

C++输入输出:cin/cout 还是 scanf/printf?

相信使用C的人都有一种迷惑或者是不自信&#xff1a;在输入输出的时候是不是应该使用scanf/printf更好呢&#xff0c;因为传说cin/cout龟速&#xff0c;我当时也长期被这个所困扰&#xff0c;后来在阅读C primer第五版的时候我自己做了一个测试&#xff0c;发现如果不使用std::…

UVA - 101:The Blocks Problem

原本以为是一道很简单的模拟题&#xff0c;结果写了一个小时。。。很长时间不碰算法题&#xff0c;的确手感差很多。不过我觉得随着刷题慢慢多起来应该会好的。 题目的意思也有点含糊&#xff0c;需要自己去猜&#xff0c;大概意思就是槽里有一堆木头&#xff0c;每个槽刚开始…

UVA - 12096:The SetStack Computer

题目描述很简单&#xff0c;难点在于如何对集合进行编码&#xff0c;因为是无限的&#xff0c;好像没有一个方向进行编码。 紫书给的题解十分巧妙&#xff1a;给新出现的集合进行编码 的确&#xff0c;我们没有必要为所有可能出现的集合编码后再开始&#xff0c;我们就可以简单…

UVA - 540:Team Queue

主要的关键在于&#xff1a;不要试图让所有团队的人在一个队列里面&#xff0c;因为这样如果新入队的是一个前面团队的成员则必须先出队再入队。 应该把每个团队看做一个整体&#xff0c;用一个队列维护团队的顺序&#xff0c;用t个队列维护每个团队内部的顺序。 还有就是要维…