二叉树的非递归遍历方式(前序、中序和后序)

C++实现递归,非递归遍历二叉树(前序,中序,后序) 初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义。实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时候就必须用到非递归遍历二叉树了。而且,当看懂非递归遍历后,你会发现,其实非递归也很简单。 我们知道,要想处理二叉树,离不开其遍历方式。遍历二叉树有三种方式,前序遍历,中序遍历,后序遍历,每种... 阅读详情

最近一直在实习,很久没有更新博客了。看到互联网面试经常考察二叉树的相关知识,所以打算写一期树的系列博客。很多同学较为熟悉递归遍历,但是可能不怎么熟悉非递归算法,所以第一篇总结下二叉树的三种非递归遍历方式。

前序遍历的基本思想:

1、创建栈对象,根节点入栈;

2、当栈非空的时候,弹出栈顶元素,访问栈顶元素

3、右子树非空,右子树入栈(先进后访问,保证根左右的顺序)

4、左子树非空,左子树入栈

5、重复2、3和4中的步骤

代码如下:

/**
 *Definition for a binary tree node.
 *public class TreeNode {
 *    int val;
 *    TreeNode left;
 *    TreeNode right;
 *    TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
   public List<Integer> preorderTraversal(TreeNode root) {
       List<Integer> list=new ArrayList<Integer>();
       if(root==null)
           return list;
       Stack<TreeNode> stack=new Stack<TreeNode>();
       stack.push(root);
       while(!stack.isEmpty()){
           TreeNode p=stack.pop();
           list.add(p.val);
           if(p.right!=null) stack.push(p.right);
           if(p.left!=null) stack.push(p.left);
       }
       return list;
    }
}


 

中序遍历基本思想:

1、根节点入栈

2、当栈非空且根节点非空,左子树节点不断入栈

3、不满足2中条件,弹出栈顶元素,访问该节点,将该节点的右子树入栈

4、重复2和3中步骤

代码如下:

/**
 *Definition for a binary tree node.
 *public class TreeNode {
 *    int val;
 *    TreeNode left;
 *    TreeNode right;
 *    TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
   public List<Integer> inorderTraversal(TreeNode root) {
       List<Integer> list=new LinkedList<Integer>();
       if(root==null) return list;
       TreeNode p=root;
       Stack<TreeNode> stack=new Stack<TreeNode>();
       while(p!=null||!stack.isEmpty()){
           if(p!=null){
                stack.push(p);
                p=p.left;
           }
           else{
                p=stack.pop();
                list.add(p.val);
                p=p.right;
           }
       }
       return list;
    }
}


 

后续遍历:

方法一,使用linkedlist中的addFirst方法

public List<Integer> postorderTraversal(TreeNode root) {
	LinkedList<Integer> ans = new LinkedList<>();
	Stack<TreeNode> stack = new Stack<>();
	if (root == null) return ans;
	
	stack.push(root);
	while (!stack.isEmpty()) {
		TreeNode cur = stack.pop();
		ans.addFirst(cur.val);
		if (cur.left != null) {
			stack.push(cur.left);
		}
		if (cur.right != null) {
			stack.push(cur.right);
		} 
	}
	return ans;
}
方法二 标记已经访问过得节点

public List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> res = new ArrayList<Integer>();
    if (root == null) {
        return res;
    }
    
    Set<TreeNode> visited = new HashSet<TreeNode>();
    Stack<TreeNode> stack = new Stack<TreeNode>();
    TreeNode node = root;
    while(true) {
        while (node != null) {
            stack.push(node);
            node = node.left;
        }
        
        if (stack.isEmpty()) {
            break;
        }
        
        node = stack.peek().right;
        if (node == null || visited.contains(node)) {
        //只访问右孩子为空或者已经访问过得节点
            node = stack.pop();
            res.add(node.val);
            visited.add(node);
            node = null;
        }
    }
    
    return res;
}







 

usb设备的定位信息获取 一个usb hub有20个口,每个口有一个标号,那么如果一个为X的标号插入了一个android设备,如何通过函数,得到这个X,代码实现如下,获取了location, 得到类似 Port_#0002.Hub_#0003 的字符串,然后,要对应一个表。 阅读详情

相关推荐

SGLang:结构化生成语言推理框架深度解读

SGLang是由斯坦福大学和加州大学伯克利分校联合提出的高性能大语言模型推理框架,针对复杂多轮对话、结构化输出等场景优化。其核心创新包括: RadixAttention机制:通过基数树数据结构实现跨请求的KV Cache自动复用,避免重复计算共享前缀 跳跃前瞻解码:对格式化输出中的固定模板部分直接填充,仅采样变量槽位,提升3-5倍生成速度 约束解码引擎:通过正则表达式和JSON Schema保证输出严格符合预定义格式 声明式DSL:提供类Python的编程接口简化复杂推理流程开发 相比传统框架,SGLang

Ricky Yang的专栏 333

非递归前序遍历二叉树(图解)

图解二叉树的非递归遍历 1. 2. 3. 4. 5. 6. 7. 9. 11. 12. 13. 14. 15. 16. 17.

uTank_yu 1104

IOS APP上架被拒 4.3(a) - Design - Spam,成功

成功解决IOS APP上架被拒 4.3(a) - Design - Spam,本篇博客记录了详细过程

qq_40147106的博客 6915

二叉树的遍历 我的

private static void preOrder(Node root){ if (root != null){ //先访问根节点 打印 然后左节点 右节点 System.out.print(root.val+"->"); preOrder(root.left); preOrd...

weixin_30908707的博客 89

Vscode远程免密连接Linux虚拟机,并配置C/C++运行环境

目前想要深入学习在Linux,也为了方便编写C/C++程序。Linux的环境里一般自带有c++的编译环境,如果没有安装gcc和g++等编译器也比较便利。但是在虚拟机里用vim编写C++程序又不得劲,因此打算使用vscode远程连接Linux虚拟机进行学习。为了防止自己以后还要再配置,重复踩坑,因此写下这篇博客用做记录。环境:windows11、VMware17、rocky linux9.1 ( 开源的CentOS9 )

m0_56779872的博客 8679

告别迷茫!新手如何从RTKLIB命令行程序入手,快速理解GNSS解算全流程

本文为GNSS新手提供RTKLIB命令行程序实战指南,重点介绍如何通过`rnx2rtkp`后处理解算工具快速掌握GNSS解算全流程。从环境搭建、程序编译到核心算法解析,帮助读者理解RTKLIB源码结构,并通过真实数据处理案例演示完整解算过程,是入门GNSS定位技术的实用教程。

weixin_42524226的博客 359

图解二叉树非递归版的前序遍历算法

“ 图解用栈数据结构对树的前序遍历,中序遍历,后续遍历。”

相信相信的力量 9352

Anaconda/Miniconda的删除和安装

要在 MacBook 上删除 Anaconda 或 Miniconda,并重新安装它,您可以按照以下步骤进行操作。

qq_27390023的博客 3029

非递归方式先序+中序+后序遍历二叉树

void preOrder(BTNode * head) { if (head == null) return ; Stack stack = new Stack(); stack.push(head); while (!stack.isEmpty()){ head= stack.top(); coutdata<<" "; stack.pop();

wuhuagu_wuhuaguo的博客 658

海康工业相机LabVIEW二次开发实战——参数配置优化与图像高效存储

本文详细介绍了海康工业相机在LabVIEW平台上的二次开发实战,重点解析了相机参数配置的优化方法与图像高效存储策略。通过剖析曝光、增益、触发模式等核心参数的设置逻辑,并结合生产者-消费者设计模式,指导开发者构建稳定、高效的图像采集与异步存储流程,有效提升工业视觉项目的开发效率与系统稳定性。

weixin_29306317的博客 222

10、智慧变电站 - 加载vue大屏元素(整体效果)

这一篇文章非常简单,但是也非常出效果阅读前面几篇文章,都可以看到有顶部、左侧、右侧的面板,主要我不会录gif图片,大屏元素面板还有一些动态加载的效果。 vue的transition标签 Vue 提供了 transition 的封装组件,可以给任何元素和组件添加进入/离开过渡;在进入/离开的过渡中,会有 6 个 class 切换:v-enter 、v-enter-active 、v-enter-to 、v-leave 、v-leave-active 、v-leave-to。我们正好使用这个特性来达到面板进入

github_39988036的博客 1041

二叉链表中序遍历非递归算法

过程初始指针指向根节点。1. 若此节点不为空,此节点入栈。2. 指针指向此节点的左孩子。3. 若此节点为空,指针指向栈顶元素并输出值,栈顶元素出栈。4. 指针指向栈顶元素的右孩子,并重复1、2、3步。图示算法实现C语言实现核心代码void InOrderTraverse(BiTree T) { BiTree p = T;//二叉树遍历

大土的博客 2785

jsqlparser 版本不兼容:net.sf.jsqlparser.statement.select.SelectItem 以及 select.SelectBody 解决方法

看Bug直接定位到最后面的错误提示,一开始以为是UnabletostartembeddedTomcat的基本错误,后续发现排查方向错误!问题比较复杂,不过这类问题可看:出现WebServerException:UnabletostartembeddedTomcat解决方法(全)

码农研究僧的博客 2673

二叉树三种(前序中序后序)遍历方式(递归版和非递归版)

递归遍历二叉树比较容易理解,就直接按照遍历方式的定义来做就行了。关键是非递归遍历二叉树。 先说一下递归遍历二叉树,三种序列遍历方式的大致结构是一样的,都是先递归遍历左子树,再递归遍历右子树,区别就在于访问节点的顺序不同,先序遍历是先访问根节点再访问左子树和右子树,所以是在一开始就输出节点值,而中序遍历是先访问左子树再访问根节点最后访问右子树,也就是说在递归遍历完当前节点左子树后进行当前节点值输出,而后序遍历是访问完当前节点左子树和右子树后再进行当前节点值的输出。 而非递归遍历二叉树的实现过程的大体框架也

AC__dream的博客 3404

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

二叉树的四种遍历方式——前序、中序、后序、层序遍历(递归+非递归实现)

如果N代表根节点,L代表根节点的左子树,R代表根节点的右子树,则根据遍历根节点的先后次序有以下遍历方式: 1. NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点--->根的左子树--->根的右子树。(简记为:根左右) 2. LNR:中序遍历(Inorder Traversal)——根的左子树--->根节点--->根的右子树。(简记为:左根右) 3. LRN:后序遍历(Postorder Traversal)——根的左子树--->根的右子树-

weixin_43298704的博客 1476

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

二叉树的前序中序后序遍历--递归和非递归两种方式(Java实现)

简单介绍一下: 前序遍历:父节点--左孩子节点--右孩子节点 中序遍历:左孩子节点--父节点--右孩子节点 后序遍历:左孩子节点--右孩子节点--父节点 前中后指的是父节点在整个树的处理过程中次序。 代码: 实体类: /** * @author yinglala */ public class BinaryTree { private int data; private BinaryTree lchild; private BinaryTree rch...

赢啦啦的博客 497

java实现二叉树的前序、中序、后序遍历(递归和非递归方式)以及层级遍历

java,二叉树,遍历

@chen 816

二叉树的遍历 前序 中序 后序 分别实现递归和非递归遍历方式

开始复习下数据结构,学习二叉树将二叉树的遍历方式实现了一遍,非递归相对有点难度,通过收集资料最终完成了二叉树的所有遍历方式,做个记录以备后用。废话不说了,贴代码! 1. BinaryTree.h #ifndef _BINARY_TREE_H_ #define _BINARY_TREE_H_ #include typedef int POS; typedef int METHOD; ty

Jason's Blog 1059

二叉树的前序、中序、后序三种遍历的六种实现方式(递归、非递归)(C++)

实现语言:C++ 存储方式:链式存储 struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x):val(x),left(NULL),right(NULL); }一、前序遍历 前序遍历方式:根左右 递归实现:递归实现的方式代码一般比较简单快捷。 voi

牛遛遛 1万+

二叉树的前序、中序、后序遍历 -- 非递归方式实现

3.判断top节点是否可以压入vector,条件为top节点的右子树为空,或者top节点的右子树已经被压入vector。1.首先用一个while循环将二叉树的最左路径节点全部压入栈内,同时由于前序遍历的特性,也。将该节点获取为当前节点后,对栈顶元素进行移除,前序遍历是在将二叉树最左路径节点压入栈的同时,也将该节点的值压入vector。4.重复循环,直到当前节点为空,或者栈为空。4.重复循环,直到当前节点为空,或者栈为空。4.重复循环,直到当前节点为空,或者栈为空。一个指向当前节点、一个指向上一栈顶节点。

m0_49619206的博客 375

java后根次序非递归输出_二叉树的前序、中序、后序遍历,通过递归和非递归的方式实现【Java】...

1 packagecom.example.demo.tree;23 importsun.tools.native2ascii.resources.MsgNative2ascii;45 import java.util.*;67 /**8 *@authorsteve9 * @date 2020/4/18 2:58 下午10 * 遍历二叉树,分别使用递归和迭代进行前序中序后序遍历一颗二叉树11 */...

weixin_32207033的博客 103

二叉树的四种非递归遍历方式(前序、中序、后序、层次遍历)C++实现

【中序遍历的非递归方法】 class Solution { public: int cnt=0; int kthLargest(TreeNode* root, int k) { //RNL 右根左 中序遍历 stack<TreeNode*> s; TreeNode* treeNode = root; while(treeNode!=NULL || !s.empty()){ while(tree

... 332

二叉树的非递归前序、中序、后序遍历(两种方式的非递归后序遍历)

1、先序的非递归 思想:先将根节点放入栈中,先入右节点,再入左节点。根据栈的原理,在访问时是左到右的。 开始时,我将push(index)这个操作放在循环里面,这是一条无限循环的不归路啊   template//非递归先序遍历,使用的是栈 void BST::iterativePreorder() {//思路:将节点放入栈中,访问之后,先放入右节点,再放入左节点。 BSTNode*ind

tang_jin2015的专栏 1923

二叉树的前序中序后序遍历和层次遍历(递归和非递归方式)

结构体 typedef struct BTNode { char data; struct BTNode *lchild; struct BTNode *rchild; }BTNode; 利用栈实现前序遍历 void preordernoRecusion(BTNode *bt) //栈实现前序遍历 { if(bt!=NULL) { BTNode *Stack[maxSize]; int top=-1; BTNode *p; Stack[++top]=bt; while(t

shrimper 320

二叉树 前序 中序 后序 非递归遍历方式

代码如下: struct Node{ Node(int _data):data(_data),left(NULL),right(NULL){} int data; Node* left; Node* right; }; void initTree(Node** head){ *head=new Node(1); (*head)->left=new Node(2); (*h

472

[数据结构] 二叉树的三种遍历方法(前序,中序,后序遍历)的递归/非递归实现方式.

前言 最近在复习数据结构,突然想起了之前用C和C++写的数据结构代码,现在将其发布到优快云,方便日后查看。 更详细的代码和其他常用数据结构的实现在GitHub上,欢迎大家关注 https://github.com/VandarkhoIme/Algorithm DataElement.h 定义了数据元素 #ifndef DATAELEMENT_H_INCLUDED #define DATAELEMENT_H_INCLUDED #define MAX_SIZE 255 //¶¨ÒåÊý¾ÝÔªËØ type

大吉的博客 532

php前序遍历,PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作

这篇文章主要介绍了关于PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下/*** PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作* A* B C* D E F G* H* 先序遍历:先遍历根节点,然后遍历左节点,最后遍历右节点: ABDHECFG* 中...

weixin_35854529的博客 228
上一篇: Eclipse配置安装Tomcat插件教程
下一篇: 常见的几大排序算法——Java语言描述
versencoder
博客等级 码龄10年 30粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值