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相关推荐

  1. Java常见算法(五)【二叉树:morris遍历】

    文章目录 二叉树遍历-线索二叉树(Morris) 1.前序遍历-线索二叉树 2.中序遍历-线索二叉树(常用) 3.后序遍历-线索二叉树(不推荐) 实验源码: 二叉树遍历-线索二叉树(Morris) h ...

  2. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

  3. 非递归,不用栈实现二叉树中序遍历

    最近总有人问这个问题:"如何不用栈,也不用递归来实现二叉树的中序遍历".这个问题的实现就是迭代器问题,无论是Java还是C++,利用迭代器遍历树节点(Java中是TreeMap类, ...

  4. 不用栈的二叉树中序遍历

    不用栈的二叉树中序遍历 // 中序遍历非栈非递归 void inOrder_noRecursion_noStack(TreeNode* r, char* pattern) {TreeNode* cur ...

  5. 不用栈实现二叉树非递归中序遍历

    偶尔看到这样一个问题: 有个二叉树,每个节点除了左右指针外,还有一个指向父节点的指针. 要求不用递归,中序遍历这棵树.另要求空间复杂度是O(1). 空间复杂度为O(1),摆明就是不让用堆栈模拟递归,所 ...

  6. 算法9---二叉树的遍历不用栈和递归

    二叉树的遍历不用栈和递归 转自:ACM之家 http://www.acmerblog.com/inorder-tree-traversal-without-recursion-and-without- ...

  7. JavaSE_Java/C++模拟实现二叉树、C++/Java四种二叉树遍历题型(递归、非递归、Morris)遍历

    文章目录 1.Java模拟实现二叉树(前序构建二叉树) 2.C++模拟实现二叉树(层序构建二叉树) 3.Java/C++三种二叉树遍历方式 前序遍历 1)递归版本 2)非递归版本 3)Morris遍历 ...

  8. 二叉树的Morris遍历:先序遍历和中序遍历

    二叉树的Morris遍历:先序遍历和中序遍历 提示:本节来说二叉树的Morris遍历,面试的高超优化技能! 此前学的关于二叉树的概念,先序遍历,中序遍历,后续遍历(这仨统称DFS遍历)和按层的方式遍历 ...

  9. 二叉树遍历 递归/非递归/morris

    前序遍历 力扣 递归 class Solution { public:vector<int> ans;vector<int> preorderTraversal(TreeNod ...

最新文章

  1. R语言构建仿真列联表并进行卡方检验(chisq.test):检验两个分类变量是否独立、输出期望的列联表
  2. 定位服务器数据丢弃包问题
  3. 01. 对称密码——算法
  4. 洛谷P4413 R2
  5. 数字孪生+交通,到底有啥用?
  6. go和python对比的优缺点_Python与Golang对比
  7. 从头开始复习css之选择器(中)
  8. ubuntu16.04 使用 rc.local 自启动加载 python 脚本
  9. 吴恩达深度学习视频-中英字幕
  10. mysql 空串 0_casewhen遇到空串转成0
  11. Base64,Base32,Base16进制的区别:
  12. 国际冠码与国际电话区号
  13. “小步快跑、快速迭代” 可用于工作的好方法
  14. [python] Python二维码生成器qrcode库入门
  15. 【易社投研资讯】销量一日暴增数倍,上海加码外牌限行,新能源车换购需求迎新一轮释放,哪些公司或将受益?
  16. 安装VMware虚拟机后,网络适配器找不到VMnet8和VMnet1解决方法。
  17. QML Map中测距——QtLocation轻量级地图应用学习
  18. java-jdk下载及安装
  19. bzoj 4765 普通计算姬
  20. 远程DNS缓存攻击__网络攻防实验三

热门文章

  1. 以后所有内容均以摘要方式发布
  2. 盘点几个值得你借鉴的Java学习方法
  3. Elasticsearch: 权威指南 » 聚合 » Doc Values and Fielddata » 聚合与分析
  4. 148. Sort List
  5. Win7开机蓝屏错误atikmpag.sys的解决方法
  6. telegram 搭建 私聊机器人 转发私聊信息 保护隐私
  7. python 报错 bs4 FeatureNotFound: Couldn‘t find a tree builder with the features you requested: lxml
  8. linux 字符串转换函数 simple_strtoul 简介
  9. PostgreSQL 理解 template1 和 template0
  10. linux shell 删除文本 较长行