[牛客经典必刷算法题] LC7-非递归求二叉树的前序遍历

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

[牛客经典必刷算法题] LC7-非递归求二叉树的前序遍历

------------------------------本题链接---------------------------

题目描述

求给定的二叉树的前序遍历。
备注:用递归来解这道题很简单,你可以给出迭代的解法么?

示例

示例

输入
{1,#,2,3}
 
返回值
[1,2,3]

思路

上一题我们已经知道了如何递归地进行二叉树遍历
递归确实是一个很好理解的办法,但是调用函数需要做许多工作,比如准备函数内局部变量使用的空间、传递函数的参数等
每次调用函数都需要做这些事情,因此会产生额外开销导致递归效率偏低,所以逻辑上开销一致时递归的额外开销会更多一些
因而,我们有时会考虑用迭代的方法减小递归的开销

我们常常使用栈辅助树的遍历,而对于bfs则用队列辅助计算

这里我们用栈辅助

遍历框架

以下我们来总结一下非递归的遍历框架:

TreeNode设定如下

public class TreeNode {
 	int val = 0;
    TreeNode left = null;
    TreeNode right = null;
 }
先序遍历
public void preorderTraversal (TreeNode root) {
	Deque<TreeNode> stack = new LinkedList<TreeNode>();
	TreeNode tmp = root;
	while(tmp != null||!stack.isEmpty()){
		// 根节点存在,则操作根节点,再遍历其左节点和右节点
		if(tmp!=null){
	    	// 对根节点的主要操作
			func(tmp); // func()为遍历操作
			// 根节点入栈
	    	stack.push(tmp);
	    	// 遍历左节点
	        tmp = tmp.left;
	     }
	     // 节点不存在,寻找右节点
	     else {
	        tmp = stack.pop();
	        // 遍历右节点
	        tmp = tmp.right;
	     }
	}
}

另一种很简单的写法:

public void preorderTraversal (TreeNode root) {
	Deque<TreeNode> stack = new LinkedList<TreeNode>(){{ add(root); }};
	while(!stack.empty()){
		// 根节点出
	    TreeNode treeroot = stack.pop();
	    // 操作根节点
	    func(treeroot)
	    // 由于是栈,先装入右节点,再装入左节点
	    // 出栈时,则先遍历左节点,再遍历右节点
	    if(treeroot.right!=null)
	        stack.push(treeroot.right);
	    if(treeroot.left!=null)
	        stack.push(treeroot.left);
	}
}
中序遍历
public void inorderTraversal (TreeNode root) {
	Deque<TreeNode> stack = new LinkedList<TreeNode>();
	TreeNode tmp = root;
	while(tmp!=null||!stack.isEmpty()){
		// 迭代寻找左子节点
		if(tmp!=null){
			// 根节点入栈
	    	stack.push(tmp);
	    	// 遍历左节点
	        tmp = tmp.left;
	     }
	     // 左节点不存在,操作节点寻找右节点
	     else {
	     	// 遍历根节点
	        tmp = stack.pop();
	        // 对节点的主要操作
			func(tmp); // func()为遍历操作
	        // 遍历右节点
	        tmp = tmp.right;
	     }
    }
}
后序遍历
public void preorderTraversal (TreeNode root) {
	Deque<TreeNode> stack = new LinkedList<TreeNode>();
	TreeNode tmp = root, pre= root;
	while(tmp != null||!stack.isEmpty()){
		// 迭代寻找子节点
		while(tmp != null){
        	stack.push(tmp);
            tmp = tmp.left;
        }
	     // 左节点不存在,寻找右节点
	     if(!stack.isEmpty()){
            TreeNode treeroot = stack.peek().right;
            if(treeroot == null || treeroot == pre){
                tmp = stack.pop();
                // 对节点的主要操作
				func(tmp); // func()为遍历操作
                pre=tmp;
                tmp=null;
            }
            else{
                tmp = treeroot;
            }
        }
    }
}

有了以上框架,再看二叉树的遍历问题就比较简单了,套入框架就可以解答本题。

解答

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型ArrayList
     */
    private ArrayList<Integer> res;
    public ArrayList<Integer> preorderTraversal (TreeNode root) {
        res = new ArrayList<>();
        if(root == null) return res;
        Deque<TreeNode> stack = new LinkedList<TreeNode>(){{ add(root); }};

        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            res.add(tmp.val);
            if(tmp.right != null) stack.push(tmp.right);
            if(tmp.left != null) stack.push(tmp.left);
        }
        return res;
    }
}
Infinite-Canvas:一站式AI绘画工作流平台部署与实战指南 在 AI 绘画和内容创作领域,你是否经常遇到这样的困扰:灵感来了,却要在多个工具间来回切换——找素材、写提示词、调整参数、批量生成,整个过程繁琐且低效。创作一个系列作品时,管理不同版本的图片和提示词更是让人头疼。如果你渴望一个能整合所有流程,实现从素材管理、提示词工程到批量出图一站式完成的工作台,那么今天介绍的 Infinite-Canvas 正是为你量身打造的解决方案。 Infinite-Canvas 是一个开源的本地网页应用,它将 AI 绘画的完整工作流集成在一个界面中。无论你是想快速生成单张图片,还是 阅读详情

相关推荐

4路QSFP28接口能玩出什么花样?基于璞致VU13P开发板的100G网络测试方案

本文详细介绍了基于璞致PZ-VU13P-KFB开发板构建100G网络测试方案的实战指南。该方案充分利用板载Xilinx Virtex UltraScale+ FPGA的强大算力与4路QSFP28接口,涵盖从光模块选型、Aurora协议配置、开源Corundum方案部署,到误码率测试及散热优化的全链路流程,为高速网络设备研发与验证提供了可靠的硬件平台。

cola5的博客 452

二叉树遍历

递归解法 List<Integer> path = null; public List<Integer> preorderTraversal(TreeNode root) { path = new ArrayList<Integer>(); dfs3(root); return path; } /** * 前序 * @param root */ public void dfs(TreeNode root) { if (root.

liukezheng3的博客 222

TSC条码打印机C#例程(tsclib.dll调用) 【转】

//----program.cs using System;using System.Collections.Generic;using System.Windows.Forms; using System.Runtime.InteropServices;public class TSCLIB_DLL{[DllImport("TSCLIB.dll", EntryPoint = "abou...

weixin_33843947的博客 2440

11、二叉树:前序遍历非递归实现

问题描述 : 目的:使用C++模板设计二叉树的抽象数据类型(ADT)。并在此基础上,使用二叉树ADT的基本操作,设计并实现简单应用的算法设计。 内容: (1)请参照链表的ADT模板,设计二叉树的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。) (2)ADT的简单应用:使用该ADT设计并实现若干应用二叉树的算法设计。 ..

windyuan~ 582

PredFormer实战:用Transformer搞定交通流量预测(附TaxiBJ数据集代码)

本文详细介绍了如何利用PredFormer这一基于Transformer的先进模型进行交通流量预测,特别针对TaxiBJ数据集提供了完整的实战代码和优化策略。PredFormer通过门控Transformer块(GTB)的创新设计,在时空预测任务中展现出显著优势,相比传统方法将MSE降低33.1%,推理速度提升4.4倍。文章还涵盖了模型轻量化、部署优化等实用技巧,为智慧城市建设中的交通预测提供了高效解决方案。

weixin_29194817的博客 444

数据质量管理的一些思考

背景 在近期的项目当中,我们为客户落地实施了数据资产平台。随后,在数据平台中接入了客户子公司的一个业务系统的明细数据。客户希望在我们的数据平台上通过数据探索和数据分析,来挖掘一些业务价值和业务创新点。 当我们拿到数据开始进行一些初步探索的时候,发现导入平台的数据质量存在一定的问题:例如一些用于数据分析的关键字段的值为空、一些本应该有主从关系的数据对应不上、数据分类混乱等。这些问题直接影响到了对...

IDEAL Garden 1万+

2016年考研数据结构算法题(递归+非递归)

已知由n(n>=2)个正整数构成的集合A ,将其划分成两个不相交的子集A1和A2,元素个数分别为n1和n2,A1和A2中元素之和分别为S1和S2。设计一个尽可能高效的划分算法,满足|n1-n2|最小且|S1-S2|最大。要求:1)给出算法的基本设计思想。2)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。3)说明你所设计算法的平均时间复杂度和空间复杂度。

Candy___i的博客 508

Unity3D Pico VR 手势交互实战:基于MRTK3实现抓握与射线控制

本文针对Pico VR原生手势交互功能不足的问题,提供了基于MRTK3实现高级手势交互的实战解决方案。通过将MRTK3成熟的交互框架与Pico的手势追踪能力相结合,详细讲解了从环境配置、SDK导入、核心适配到真机调试的全流程,帮助开发者高效实现抓握与射线控制等复杂交互,有效提升Pico VR应用的开发效率与体验。

weixin_29011667的博客 389

Leetcode算法题-二叉树

124. 二叉树中的最大路径和 https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/ class Solution { int maxValue; public int maxPathSum(TreeNode root) { maxValue = Integer.MIN_VALUE; maxPathDown(root); return maxValue; }

qq_27534691的博客 311

Klipper-源码模块

Klippy上位机程序采用多线程架构,包含四个主要进程:主线程处理G代码命令、串口IO线程(C语言实现)、MCU响应处理线程(Python实现)和独立日志线程。代码结构分为三大模块:chelper(C语言辅助函数)、extras(扩展功能如温度控制)和kinematics(运动学模型实现)。核心功能模块包括串口通信(serialhdl.py)、步进电机控制(stepper.py)、运动学计算等,其中C语言实现的底层模块通过serialqueue.c处理高效IO。扩展模块支持热床、传感器等外设,运动学子模块提

weixin_44258581的博客 990

关于海康MVS软件显示速率低与1GB、相机丢包的设置优化

工控机主要应用与视觉检测!相机网线及工控机网口都是千兆的!设置完巨帧数和速度与双工(选择为全双工),显示速度低与1GB,不能够正常工作。C.LA-Properdes-Advanced-将RecerveBuffers更改为2048。E.LAN-属性-电源管理-取消选中允许计算机关闭此设备以保存电源。这种情况均为MVS设置不熟悉,可参照如下设置优化相应端口相机配置。D.局域网-属性-高级-将传输缓冲区更改为20484。B.LAN-属性-高级-将中断记录部分更改为执行。A.关闭采集控制帧速率控制。

米可的博客! 8820

快速排序 - 递归、非递归实现【十大经典排序算法】

快速排序 - 递归、非递归实现【十大经典排序算法】

weixin_45565886的博客 395

【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码+数据集+原理介绍)

本专栏整理了《深度学习时间序列预测案例》,内包含了各种不同的基于深度学习模型的时间序列预测方法,例如LSTM、GRU、CNN(一维卷积、二维卷积)、LSTM-CNN、BiLSTM、Self-Attention、LSTM-Attention、Transformer等经典模型,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 4万+

【LC】二叉树应用强化OJ

二叉树的使用运用, OJ习题解析, 巩固理解练习二叉树的各种操作.

trong_ 的烂笔头 2338

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

笔试面试算法经典--二叉树的镜像-递归与非递归实现(Java)

给出一棵二叉树,求它的镜像,如下图:右边是二叉树是左边二叉树的镜像。解法1(递归)思路1:如果当前节点为空,返回,否则交换该节点的左右节点,递归的对其左右节点进行交换处理。public static void mirrorTree(TreeNode root) { if(root==null) return; //交换该节点指向的左右节

有图有真相 8294

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

汉诺塔问题(递归与非递归)

关于汉诺塔问题的过程分析以及递归非递归两种解法的推理

月巴虫丰博客 4492

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 15

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 437

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 362

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 77

AI和大模型—从克里金算法说开去

克里金算法源于矿业勘探,通过空间自相关性实现稀疏数据下的最优预测,核心优势在于不确定性量化。在AI大模型中,其等价于高斯过程,广泛应用于超参数优化、小样本建模与推理调度。尽管面临计算复杂度高、核函数选择难等问题,通过稀疏化、分治法与低秩近似可有效优化。该方法在降低训练成本、提升泛化能力及减少幻觉方面表现突出,尤其适用于高维、高成本的智能系统优化,具有重要借鉴价值。

fpcc的专栏 602

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 176

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 306

不同的二叉搜索树

互不相同的二叉搜索树的种数,以 j (1<=j<=i)为头节点,左子树是 j-1 个数,右子树就是 i - (j - 1) -1 = i - j个数。所以dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]头1 = 左子树0节点 * 右子树2节点,二叉搜索树就是排序树,左子树<根节点<右子树,左右子树也满足左子树<根节点<右子树。头2 = 左子树1节点 * 右子树1节点。所以dp[i] += dp[j-1] * dp[i-j]个节点组成且节点值从。

qq_44721738的博客 150

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 381

固件开发岗算法

背景:嵌入式固件岗,偏爱手写库函数、位运算、数组基础算法。

2502_90352018的博客 109
上一篇: [牛客经典必刷算法题] LC6-二叉树的后序遍历
下一篇: [牛客经典必刷算法题] LC8-重排链表
Coder_JC_Liu
博客等级 码龄7年 2粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值