c++练习(5):二叉树非递归遍历

article/2025/9/22 15:59:33

二叉树遍历

二叉树有三种遍历方法:前序(跟左右)跟节点在前面、中序(左跟右)跟节点在中间、后续(左右跟)跟节点在后面
在这里插入图片描述

  • 前序(跟左右):上图的二叉树,第一次跟左右对应ABC,对于B来说跟左右对应BD空, 汇总下顺序为:ABDC

如何通过计算机自动找出来呢?
在这里插入图片描述

我们实现的方法是通过来实现的,的特点是先进后出
在这里插入图片描述
如果放入循序是A->B->C,出来的的是C->B->A 。如果希望出来的是A->B->C,则放入的顺序应该是C->B->A 。其中C对应上图树中的,B对应于树中的,A对应于树中的.

所以我们要按照右左跟的顺序往栈里面放数据,才能拿出来跟左右的前序遍历结果。
在这里插入图片描述

如何通过代码来实现

  • new 一个,栈是空的,我们首先把节点A放进去,目的是要变成放入顺序为C->B->A的栈。

在这里插入图片描述
先在的问题变成了,如何从只有跟节点A的栈变成放入顺序为C->B->A的栈。

  • 首先pop A,然后把C放进去。 其中C=A->right,跟节点A比较有价值,他知道两个元素的地址。
  • 然后把A-right放进去,然后把A->left放进去,然后再把A放进去。此时A已经没有利用价值了,通过标记NULL将节点A杀掉。
    在这里插入图片描述
  • 如何呢?先把null pop掉,找到要卸磨杀驴的驴A,将它也pop掉。pop之后将A放在一个vector容器中。然后就变成了C->B
    在这里插入图片描述
    此时B没有NULL的标识,没有要的标签,所以说明这头驴B还有价值,那我们就需要利用它的价值,它的价值是左右两个节点的地址,
  • 在根据之前A的流程,把Bpop出去,要获得B跟左右的输出,就需要按照右左跟的顺序压栈。这里,右就不用管了。B的左是D,因此将D压如栈中,然后跟上B本身。
    在这里插入图片描述
  • 此时B就没有价值了,因为已经利用到了B它的左右子节点,因此B就是需要掉的驴,给B赋一个NULL,然后把NULLpop掉,把Bpop掉。紧接着把B放入vector容器中。
  • 就剩下CD了,此时Top不是NULL,说明D不是要杀掉的,它还存在使用价值,然后重复之前步骤,根据右左跟的顺序,D的右子节点为因此不用写,D的左子节点也是,不用写。此时D也就没有价值了,因为它的左右子节点都被找到并利用了。此时D就变成要杀掉的(比喻:卸磨杀驴,榨干玩剩余价值),将D赋予NULL,然后把NULLpop 出来,然后把Dpop出来,紧接着把D放入vector容器中。
  • 同理CD一样,最后C也被放入了vector容器中
  • 最后vector中的顺序为A->B->D->C,和我们之前自己算出来是一样的

代码

假设二叉树已经创建好了,需要有一个栈来实现,写一个函数来实现二叉树遍历。
定义树的节点.

typedef struct node
{int val;struct node* left;  // 左子节点struct node* right; // 右子节点	
}Treenode

定义函数void DieDai(Treenode* root) 形参为跟节点
先类似伪代码实现

vector<int> DieDai(Treenode* root)
{stack<Treenode*> stk;vector<int> v1;if(root!=NULL) stk.push(root);while(stk.empty==false){Treenode* top=stk.top;if(stk.top!=NULL)  //不杀驴,利用其价值,可以找到左右子节点{stk.push(top->right);stk.push(top->left);stk.push(top);stk.push(NULL); //top的价值使用完了,需要贴上NULL标签}else{//stk.top=NULL 说明价值被利用干,需要卸磨杀驴stk.pop()		//移除NULLtop=stk.top()   //移除了NULL之后的,top对应的元素stk.pop()  v1.push_back(top.val)    }}return v1
}

总结

  • 判断top是否为NULL
  • 不是NULL,按顺序右左跟
  • 如果是NULL,说明是要杀的驴:1. 将NULL(top) pop 掉 2.将新的top(栈元素) pop 3. 将top中的val 放到vector容器中

这就是完整的二叉树非递归遍历的顺序。


http://chatgpt.dhexx.cn/article/HhdZxNjl.shtml

相关文章

C++——二叉树OJ|二叉树非递归遍历

目录 二叉树的前序遍历 二叉树的中序遍历 二叉树的后续遍历 二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> preorderTraversal(TreeNode* root) { TreeNode* curroot; stack<TreeNode*>…

数据结构与算法_二叉树非递归遍历

记录二叉树的前序&#xff0c;中序&#xff0c;后续&#xff0c;层序等非递归遍历。 1 二叉树非递归前序遍历 用栈实现二叉树非递归前序遍历&#xff0c;按照 V L R顺序进行遍历&#xff1b;每一个都按照V L R方式进行。 上图中&#xff0c;根节点先入栈&#xff0c;出栈并访…

二叉树遍历非递归C++

二叉树遍历非递归C 题目链接二叉树的前序遍历思路分析代码实现 二叉树的中序遍历思路分析代码实现 二叉树的后序遍历思路分析代码实现 一点点题外话 题目链接 二叉树的前序遍历 144. 二叉树的前序遍历 思路分析 既然要使用非递归的方式&#xff0c;那就必须要借助栈来进行处…

二叉树的遍历(非递归)

由于二叉树的递归方法实际上是系统在使用栈进行操作&#xff0c;因此我们的迭代&#xff08;非递归&#xff09;方法也就需要使用栈进行模拟。 一、先序遍历 我们需要明白&#xff0c;进栈的元素都是树的根节点 root。 所以我们需要先访问该节点&#xff0c;再将该节点进栈。…

二叉树非递归遍历算法分析

以前没有学习过树的相关算法&#xff0c;只是了解一些皮毛&#xff0c;最近开始认真学习它。看视频或者网上查资料&#xff0c;可以知道怎么去遍历一棵树&#xff0c;但是算法为什么是这样的呢&#xff1f;少有讲到。如果有一天&#xff0c;我忘记了这个算法&#xff0c;我需要…

c语言和c++实现二叉树非递归遍历

结合栈结构来实现二叉树的非递归遍历&#xff0c;首先将根节点入栈&#xff0c;然后对栈内元素进行循环&#xff0c;弹出栈顶元素&#xff0c;根据链表结点携带的标志位flag来判断是对于结点进行打印还是后续的入栈操作。入栈顺序决定着实际的遍历方式。 main.cpp #include&l…

【数据结构】二叉树的非递归遍历(完整代码)

默认给一棵树前序遍历的结果&#xff0c;按要求创建这棵树&#xff08;#表示空&#xff09;&#xff0c;并用非递归的方法对它进行遍历。 解题思路 1.递归遍历&#xff1a; 则将二叉树的遍历看作是分治问题&#xff0c;将每一棵树都分为根-左子树-右子树三部分&#xff0c;每…

数据结构--二叉树的遍历(非递归)

我们已经对二叉树的基本概念有了一定的了解&#xff0c;也对它的递归版本的前、中、后序遍历掌握的很好了&#xff0c;那么接下来就要介绍二叉树中遍历的非递归版本 >【数据结构】二叉树详解< 先看本篇文章效果更佳哦 目录 1、非递归遍历解析2、前序遍历(非递归)3、中序…

二叉树的非递归遍历 C语言版

文章作者&#xff1a;Slyar 文章来源&#xff1a;Slyar Home (www.slyar.com) 转载请注明&#xff0c;谢谢合作。 上周数据结构课在讲二叉树的遍历&#xff0c;老师只讲递归算法&#xff0c;没有什么技术含量&#xff0c;遂自己琢磨非递归算法实现... 前序遍历:先访问根节点&…

二叉树非递归遍历

1. 遍历一棵树 前、中、后序遍历的路径实际是相同的&#xff0c;都是以如上路径去游历。 前、中、后序访问的结果不同&#xff0c;实际是访问节点的时机不同&#xff1a; 前序&#xff1a;一遇到节点就去访问 中序&#xff1a;访问完左树再去访问 后序&#xff1a;访问完右子…

C语言数据结构七:二叉树非递归遍历

二叉树的非递归遍历&#xff0c;必须借助栈的辅助。必须采用栈的这种先进后出的特性。 算法实现思路&#xff1a; 我们先将根节点压入栈中。然后往外弹出元素。直到栈中元素弹完为止。1、将根节点压入栈中。&#xff08;但是压入栈中&#xff0c;并不知简单的将根节点压入栈中…

二叉树非递归遍历(先序、中序、后序)

首先是一个二叉树结构&#xff1a; class TreeNode{public int value;public TreeNode left;public TreeNode right;public TreeNode(){}public TreeNode(int v){valuev;} 非递归的二叉树遍历需要用到栈的先进后出。 先序遍历 步骤&#xff1a; 1、首先定义一个当前正在检索…

二叉树非递归遍历(c语言)

结果如下图&#xff1a; #号代表NULL&#xff0c;此时没有节点 一、在c语言中进行二叉树的非递归遍历需要用到栈&#xff0c;而在c语言中没有直接调用栈的接口&#xff0c;所以在实现非递归遍历时需要先实现一个栈&#xff0c;需要用到出栈&#xff0c;入栈&#xff0c;栈顶元…

二叉树非递归遍历实现(Java)

首先理解一下二叉树节点结构。left指向左节点&#xff0c;right指向右节点&#xff0c;val为节点中的值。 class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int x) {val x;}} 先序遍历 //非递归先序遍历&#xff08;需一个辅助栈&#xff0c;顺序为根…

二叉树遍历的一些非递归算法

二叉树的非递归算法因为涉及到栈和队列&#xff0c;所以写的时候总是受到伪代码的干扰&#xff0c;要完整的补全栈和队列的结构有些麻烦&#xff0c;这里借鉴了一些大佬的思想&#xff0c;发现可以直接在树中模拟栈和队列的存在&#xff0c;这给非递归的完整代码带来了很大的便…

三种非递归遍历二叉树的方法

就以这个树为例&#xff0c;来讲讲二叉树的非递归遍历。 先序遍历&#xff1a; 先序遍历结果为3 4 6 5 8 9&#xff0c;就拿树的左枝为例&#xff0c;3是根&#xff0c;打印&#xff0c;4是3的左孩子&#xff0c;打印&#xff0c;6是4的左孩子&#xff0c;打印&#xff0c;6的…

二叉树的非递归遍历

目录 一.前序遍历&#xff08;根左右&#xff09; 1.思路图解 2.代码 二.中序遍历&#xff08;左根右&#xff09; 1.思路图解 2.代码 三.后序遍历&#xff08;左右根&#xff09; 1.思路图解 2.代码 四.层序遍历 1.思路图解 2.代码 一.前序遍历&#xff08;根左右…

smile——Java机器学习引擎

介绍 Smile&#xff08;统计机器智能和学习引擎&#xff09;是一个基于Java和Scala的快速、全面的机器学习、NLP、线性代数、图形、插值和可视化系统。 凭借先进的数据结构和算法&#xff0c;Smile提供了最先进的性能。Smile有很好的文档记录&#xff0c;请查看项目网站以获取…

Java机器学习库(Java ML)(一、分类)

本文章翻译至Java ML技术文档classification.pdf&#xff0c;代码部分是参考该文档使用IDEA编写&#xff0c;同时加入了运行结果。 分类 本文介绍与分类相关的功能。 该文章假设您已熟悉Java ML的基础知识&#xff0c;如入门教程中所述&#xff08;http://java-ml.sourcefor…

目前流行的、强大的基于Java的机器学习开发库精选

图片来源: Mindfire Solutions 现如今&#xff0c;拥有深度学习和机器学习领域的技术是科技界的趋势之一&#xff0c;并且企业则希望雇佣一些拥有良好的机器学习知识背景的程序开发工程师。本文将介绍一些目前流行的、强大的基于Java的机器学习库&#xff0c;希望给大家带来帮助…