不用栈的直接二叉树遍历-morris travalsal
1.利用morris travalsal实现二叉树的中序遍历(要求不能破坏二叉树)
根节点总是从左孩子的最右节点来,到右子树的最左节点
https://leetcode.wang/leetCode-94-Binary-Tree-Inorder-Traversal.html
每个节点的后继节点有三种情况
1.编号为7的这种左叶子,后继节点是他的父节点
2.编号为4的这种父节点,后继节点是包括他的右节点在内的的最左节点
3.编号为2的这种右叶子,后继节点是2-4链的右上方(5)
可以看出,父节点的下一个节点就是right
叶子节点的下一个节点需要提前构造,构造方法为:父节点的左子树的最右叶子的下一个节点是父节点,比如2和5
算法如下:
1、cur.left 为 null,保存 cur 的值,更新 cur = cur.right2、cur.left 不为 null,找到 cur.left 这颗子树最右边的节点记做 last2.1 last.right 为 null,那么将 last.right = cur,更新 cur = cur.left2.2 last.right 不为 null,说明之前已经访问过,第二次来到这里,
表明当前子树遍历完成,保存 cur 的值,更新 cur = cur.right
关键字:把中序节点挂到右边
vector<int> inorderTraversal(TreeNode* root) {vector<int> res;TreeNode* cur = root;while (cur){if (cur->left == NULL){res.push_back(cur->val);cur = cur->right;}else{TreeNode* tmp = cur->left;while (tmp->right && tmp->right != cur) tmp = tmp->right;if (tmp->right == NULL) {tmp->right = cur;cur = cur->left; }else if (tmp->right == cur){res.push_back(cur->val);tmp->right = NULL;cur = cur->right;}}}return res;}
2.先根遍历
和中序遍历的区别在于,中序遍历使得左子树的最右节点的下一个是根节点,先根遍历的下一个节点是根节点的右节点
vector<int> preorderTraversal(TreeNode* root) {vector<int> res;TreeNode* cur = root;while (cur){if (cur->left == NULL){res.push_back(cur->val);cur = cur->right; }else{TreeNode* tmp = cur->left;while (tmp->right && tmp->right != cur) tmp = tmp->right;if (tmp->right == NULL){res.push_back(cur->val);tmp->right = cur;cur = cur->left;}else if (tmp->right == cur){tmp->right = NULL;cur = cur->right;}}}return res;}
3.后序遍历
https://leetcode.wang/leetcode-145-Binary-Tree-Postorder-Traversal.html
先根遍历就是从根节点(右上,比如15)一直到左下(比如1)
利用morris算法,每个节点都要被访问两次
当一个节点被访问第二次的时候,将这个节点左孩子, 左孩子的右孩子,左孩子的右孩子的右孩子........按照倒序插入,
比如5,6,7
不用栈的直接二叉树遍历-morris travalsal相关推荐
- Java常见算法(五)【二叉树:morris遍历】
文章目录 二叉树遍历-线索二叉树(Morris) 1.前序遍历-线索二叉树 2.中序遍历-线索二叉树(常用) 3.后序遍历-线索二叉树(不推荐) 实验源码: 二叉树遍历-线索二叉树(Morris) h ...
- 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法
本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...
- 非递归,不用栈实现二叉树中序遍历
最近总有人问这个问题:"如何不用栈,也不用递归来实现二叉树的中序遍历".这个问题的实现就是迭代器问题,无论是Java还是C++,利用迭代器遍历树节点(Java中是TreeMap类, ...
- 不用栈的二叉树中序遍历
不用栈的二叉树中序遍历 // 中序遍历非栈非递归 void inOrder_noRecursion_noStack(TreeNode* r, char* pattern) {TreeNode* cur ...
- 不用栈实现二叉树非递归中序遍历
偶尔看到这样一个问题: 有个二叉树,每个节点除了左右指针外,还有一个指向父节点的指针. 要求不用递归,中序遍历这棵树.另要求空间复杂度是O(1). 空间复杂度为O(1),摆明就是不让用堆栈模拟递归,所 ...
- 算法9---二叉树的遍历不用栈和递归
二叉树的遍历不用栈和递归 转自:ACM之家 http://www.acmerblog.com/inorder-tree-traversal-without-recursion-and-without- ...
- JavaSE_Java/C++模拟实现二叉树、C++/Java四种二叉树遍历题型(递归、非递归、Morris)遍历
文章目录 1.Java模拟实现二叉树(前序构建二叉树) 2.C++模拟实现二叉树(层序构建二叉树) 3.Java/C++三种二叉树遍历方式 前序遍历 1)递归版本 2)非递归版本 3)Morris遍历 ...
- 二叉树的Morris遍历:先序遍历和中序遍历
二叉树的Morris遍历:先序遍历和中序遍历 提示:本节来说二叉树的Morris遍历,面试的高超优化技能! 此前学的关于二叉树的概念,先序遍历,中序遍历,后续遍历(这仨统称DFS遍历)和按层的方式遍历 ...
- 二叉树遍历 递归/非递归/morris
前序遍历 力扣 递归 class Solution { public:vector<int> ans;vector<int> preorderTraversal(TreeNod ...
最新文章
- R语言构建仿真列联表并进行卡方检验(chisq.test):检验两个分类变量是否独立、输出期望的列联表
- 定位服务器数据丢弃包问题
- 01. 对称密码——算法
- 洛谷P4413 R2
- 数字孪生+交通,到底有啥用?
- go和python对比的优缺点_Python与Golang对比
- 从头开始复习css之选择器(中)
- ubuntu16.04 使用 rc.local 自启动加载 python 脚本
- 吴恩达深度学习视频-中英字幕
- mysql 空串 0_casewhen遇到空串转成0
- Base64,Base32,Base16进制的区别:
- 国际冠码与国际电话区号
- “小步快跑、快速迭代” 可用于工作的好方法
- [python] Python二维码生成器qrcode库入门
- 【易社投研资讯】销量一日暴增数倍,上海加码外牌限行,新能源车换购需求迎新一轮释放,哪些公司或将受益?
- 安装VMware虚拟机后,网络适配器找不到VMnet8和VMnet1解决方法。
- QML Map中测距——QtLocation轻量级地图应用学习
- java-jdk下载及安装
- bzoj 4765 普通计算姬
- 远程DNS缓存攻击__网络攻防实验三
热门文章
- 以后所有内容均以摘要方式发布
- 盘点几个值得你借鉴的Java学习方法
- Elasticsearch: 权威指南 » 聚合 » Doc Values and Fielddata » 聚合与分析
- 148. Sort List
- Win7开机蓝屏错误atikmpag.sys的解决方法
- telegram 搭建 私聊机器人 转发私聊信息 保护隐私
- python 报错 bs4 FeatureNotFound: Couldn‘t find a tree builder with the features you requested: lxml
- linux 字符串转换函数 simple_strtoul 简介
- PostgreSQL 理解 template1 和 template0
- linux shell 删除文本 较长行