二叉树的遍历(前,中,后)
二叉树的遍历
1:前序遍历
- 在这个图中,我们把1 ,2 ,4三个节点压入了栈中
- 在压入栈的时候,直接读取
- 然后我们把2弹出来
- 判断右边是不是为空,如果不为空
- 按照第一步的方法,以该节点为根节点,把左子节点压入栈中,压入的时候进行读取
- 如果为空,就什么都不做
- 判断右边是不是为空,如果不为空
#include<iostream>
#include<vector>
#include<stack>using namespace std;struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}};// 我们使用非递归的方式
class Solution {public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;if(root == nullptr) return res;stack<TreeNode*> mystack;while(root != nullptr){res.push_back(root->val);mystack.push(root);root = root->left;}while(!mystack.empty()){TreeNode* temp = mystack.top();mystack.pop();if(temp->right != nullptr){TreeNode* newNode = temp->right;cout << newNode->val;while(newNode != nullptr){res.push_back(newNode->val);mystack.push(newNode);newNode = newNode->left;}}}for(int i = 0; i < res.size(); i++){cout << res[i] << " ";}cout << endl;return res;}
};
2:中序遍历
- 结果是 4 2 6 5 7 1 3
- 将左子节点压入栈中,1,2,4
- 将他们弹出来,然后弹出来之后进行访问
// 在前序的基础上,压入的时候不进行遍历,弹出的时候进行遍历
3:后续遍历
- 结果是4 6 7 5 2 3 1
- 我们还是压入左子树
- 弹出了四
- 此时判断右子树没有,我们遍历4
- 弹出了二
- 此时右子树是有的,所以我们将5 和 6 进行弹入
- 弹出6,此时可以遍历
- 弹出5,此时右子树有7,什么时候进行打印呢??
——————————————————学习——————————————
- 栈和空的,root 不为空
- 将1,2,4压入到栈中
- 将4弹出来
- 判断4的右边是不是为空,或者是是不是上次的prev,为空,直接读取,将prev设置为4,root 设置为null
- 将2弹出来
- 判断2的右边不为空,
- 将2探进去,把5,6探进去
- 把6 弹出来
- 把5弹出来
- 右边的元素不是prev,所以要再弹出来
- 判断2的右边不为空,
#include<iostream>
#include<vector>
#include<stack>using namespace std;struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};class Solution {public:vector<int> postorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode *> mystack;TreeNode* prev;while(root != nullptr || !mystack.empty()){while(root != nullptr){mystack.push(root);root = root->left;}root = mystack.top();mystack.pop();if(root->right == nullptr or root->right == prev){res.push_back(root->val);prev = root;root = nullptr;}else{mystack.push(root);root = root->right;}}return res;}
};
二叉树的遍历(前,中,后)相关推荐
- python实现二叉树非递归前中后序遍历
python实现二叉树非递归前中后层序遍历 二叉树是数据结构中重要的一部分,本文简单介绍用python实现二叉树的前中后序遍历,包括递归和非递归思路算法. # -*- 二叉树 begin -*- # ...
- 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】
文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...
- java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...
- 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)
二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...
- 二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法
关于二叉树的前序遍历(preoder).中序遍历(inorder)和后序遍历(postorder),实际上只需要记住:左子节点一定在右子节点的左边(左右),所谓前中后序遍历就是根节点的位置不同,前序是 ...
- [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]
[问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...
- 二叉树的层序遍历和前中后序遍历代码 迭代/递归
二叉树的层序遍历和前中后序遍历代码 迭代/递归 只记录代码.思路参考代码随想录:https://github.com/youngyangyang04/leetcode-master/blob/mast ...
- 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解
前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...
- 二叉树非递归dfs——简单思路搞定前中后序遍历
前言:相信很多同学都被二叉树非递归dfs的前中后序遍历方法弄的头疼.网上的答案,什么前中后序遍历各有一套写法,还有什么一个栈的写法,两个栈的写法.看起来能理解,一闭眼自己写都记不住.今天介绍一种用一种 ...
- 数据结构之二叉树的前中后序遍历以及层序遍历
学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...
最新文章
- 英特尔11代 16G内存笔记本,为你免费包邮到家
- python怎么加载图片-如何用python获取图像
- linux下模拟cc攻击命令,介绍几种用Linux命令判断CC攻击的方法
- K8s 工程师必懂的 10 种 Ingress 控制器
- C++实现链栈的基本操作
- unity3d collider自动调整大小_自动网格组合建模工具Unity游戏素材资源
- python技术文档_Python技术文档最佳实践
- sourcetree克隆一直不成功_Git神器| SourceTree安装使用教程
- QT程序在windows下部署发布
- java.net.UnknownHostException 未知的名称或服务
- java用不起_Java,泛型不起作用
- SVN合并分支到主干(简单易懂)
- VM296:1 Uncaught SyntaxError: Unexpected token u in JSON at position 0 at JSON.parse (anonymous)
- 拜年神器php,Biu神器安卓版
- 阿里P6级别Java程序员月薪多少?阿里认证员工给出答案
- k43.第十七章 K8s运维篇-DevOps 持续集成 持续部署 (三)
- 银川清华计算机技术培训,银川有没有本地IT技能培训?
- ei指什么_SCI、EI分别是什么意思
- 【2019-09-04】恐惧就是进化的暗示
- python保存文件的几种方式