#include<iostream>
using namespace std; struct TreeNode{
int val;
TreeNode* right;
TreeNode* left;
TreeNode(int _val):val(_val),right(nullptr),left(nullptr){}
}; void Morris(TreeNode* root){
if(root == nullptr)
return;
TreeNode* cur=root;
TreeNode* mostRight=nullptr; //当cur为空停止,即上图中的情况3
while(cur != nullptr){
mostRight=cur->left;
//如果mostRight!=nullptr,进入情况2
if(mostRight != nullptr){
while(mostRight->right && mostRight != cur)
mostRight=mostRight->right;
//当mostRight == nullptr,即情况2.a
if(mostRight->right == nullptr){
mostRight->right=cur;
cur=cur->left;
continue;
}
else{ //当mostRight == cur,即情况2.b
mostRight->right=nullptr;
/*cur=cur->left;
continue;*/
}
}
//mostright为空进入情况1
cur=cur->left;
}
}

Morris前序遍历

有左子树就会回到cur节点两次,没有就来一次

void MorrisPre(TreeNode* root) {
if (root == nullptr)
return;
TreeNode* cur = root;
TreeNode* mostRight = nullptr; while (cur != nullptr) {
mostRight = cur->left; if (mostRight != nullptr) {
while (mostRight->right && mostRight->right != cur) {
mostRight = mostRight->right;
} if (mostRight->right == nullptr) {
//第一次到达左子树的最右子树
printf("%d ", cur->val);
mostRight->right = cur;
cur = cur->left;
continue;
}
else {
//第二次到达左子树的最右子树
mostRight->right == cur;
mostRight->right = nullptr;
/*cur = cur->right;
continue;*/
}
}
else {
//当前cur只能来一次
printf("%d ", cur->val);
} cur = cur->right;
}
}

Morris中序遍历

void MorrisIn(TreeNode* root) {
if (root == nullptr)
return;
TreeNode* cur = root;
TreeNode* mostRight = nullptr; while (cur != nullptr) {
mostRight = cur->left; if (mostRight != nullptr) {
while (mostRight->right && mostRight->right != cur) {
mostRight = mostRight->right;
} if (mostRight->right == nullptr) { //第一次到达左子树的最右子树
mostRight->right = cur;
cur = cur->left;
continue;
}
else { //第二次到达左子树的最右子树 mostRight->right == cur;
mostRight->right = nullptr;
/*cur = cur->right;
continue;*/
}
} //往右移动的时候打印
printf("%d ", cur->val);
cur = cur->right;
}
}

Morris后序遍历

//右孩子指向上一个节点
TreeNode* ReverseNode(TreeNode* node) {
TreeNode* pre = nullptr;
TreeNode* next = nullptr;
while (node) {
next = node->right;
node->right = pre;
pre = node;
node = next;
}
return pre;
} //逆序打印左孩子的右边界
void PrintNode(TreeNode* node) {
TreeNode* tail = ReverseNode(node);
TreeNode* cur = tail;
while (cur) {
printf("%d ", cur->val);
cur = cur->right;
}
ReverseNode(tail); //还原
} void MorrisPos(TreeNode* root) {
if (root == nullptr)
return;
TreeNode* cur = root;
TreeNode* mostRight = nullptr; while (cur != nullptr) {
mostRight = cur->left; if (mostRight != nullptr) {
while (mostRight->right && mostRight->right != cur) {
mostRight = mostRight->right;
} if (mostRight->right == nullptr) { //第一次到达左子树的最右子树
mostRight->right = cur;
cur = cur->left;
continue;
}
else { //第二次到达左子树的最右子树 mostRight->right == cur;
mostRight->right = nullptr; //逆序打印左子树的右边界
PrintNode(cur->left);
}
}
cur = cur->right;
} PrintNode(root);
}

Morris遍历以及Morris前序中序后序遍历实现的更多相关文章

  1. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  2. PAT 1043 Is It a Binary Search Tree (25分) 由前序遍历得到二叉搜索树的后序遍历

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  3. 二叉树 遍历 先序 中序 后序 深度 广度 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. 前序+中序->后序 中序+后序->前序

    前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...

  5. UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

    Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...

  6. SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  7. 给出 中序&后序 序列 建树;给出 先序&中序 序列 建树

    已知 中序&后序  建立二叉树: SDUT 1489 Description  已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input  输入数据有多组,第一行是一个整数t (t& ...

  8. SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...

  9. 【C&数据结构】---关于链表结构的前序插入和后序插入

    刷LeetCode题目,需要用到链表的知识,忽然发现自己对于链表的插入已经忘得差不多了,以前总觉得理解了记住了,但是发现真的好记性不如烂笔头,每一次得学习没有总结输出,基本等于没有学习.连复盘得机会都 ...

  10. 前序 中序 后序 遍历 递归 非递归算法 java实现

    前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...

随机推荐

  1. Python项目框架的搭建

    Python的框架搭建,有七个步骤 第一步:创建项目 首先我们打开pycharm,然后点击第一个Create New Project ,创建一个新的项目. 在选项里面是有一个Flask的,然后就是项目 ...

  2. 宿主机通过vmware创建的kali虚拟机连接redis,sftp等功能

    介绍 黑客专用的linux kali, 下载后即包含很多黑客工具,对于我这样的菜鸡,很感动的就是里面包含了最新版的redis,java,mysql等工具.自带不错的界面省事 kali官网: https ...

  3. Kubernetes--Pod对象的生命周期

    Pod对象自从其创建开始至其终止退出的时间范围称为其生命周期.在这段时间中,Pod会处于多种不同的状态,并执行一些操作:其中,创建主容器(main container)为必需的操作,其他可选的操作还包 ...

  4. Java方法定义及调用。

    一.什么是方法 1.Java方法是语句的集合,它们在一起执行一个功能. ①方法是解决一类问题的步骤的有序组合 ②方法包含与类或对象中 ③方法在程序中被创建,在其他地方被引用 2.设计方法的原则:方法的 ...

  5. nohup--将程序放入后台执行

    作用:可以将程序以忽略挂起信号的方式运行,常与&一起使用 语法: nohup Command [ Arg - ] [ & ] 将程序放到后台运行的方法: command &  ...

  6. IDEA 项目运行内存设置

    IDEA 运行内存设置 1.堆内存设置 2.help ---- edit custom VM options 参考摘录:https://blog.csdn.net/wentaolv/article/d ...

  7. window python 主函数 写 if __name__ == "__main__": 可以避免多进程等错误(训练yolov8时出现的)

    训练yolov8时出现 类似以下错误: RunTimeError: An attempt has been made to start a new process before the current ...

  8. ABC 171 F - Strivore 【容斥】

    https://atcoder.jp/contests/abc171/tasks/abc171_f 题意 给你一个数 \(k\) ,一个字符串 \(s\) (只包含小写字母) 定义一次操作:把任意小写 ...

  9. java位运算分析

    java位运算 java位运算在平常的编码过程中十分场景,通常框架都替我们封装好了,我对于细节方面反而一知半解,下面就重新梳理一下. 优秀的框架使得我们轻松,也使得我们距离真相越来越远. 位运算种类 ...

  10. Spark log4j 配置

    Spark的ml包提供了非常好用的调参功能,通过ParamGridBuilder构建待选参数(如:logistic regression的regParam),然后数据量小的时候可以用CrossVali ...