博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Morris遍历以及Morris前序中序后序遍历实现
阅读量:6118 次
发布时间:2019-06-21

本文共 4200 字,大约阅读时间需要 14 分钟。

#include
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; }}
View Code

 

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);}

 

转载于:https://www.cnblogs.com/darkif/p/10531043.html

你可能感兴趣的文章
Java 内存区域和GC机制
查看>>
更新代码和工具,组织起来,提供所有博文(C++,2014.09)
查看>>
HTML模块化:使用HTML5 Boilerplate模板
查看>>
登记申请汇总
查看>>
Google最新截屏案例详解
查看>>
2015第31周一
查看>>
2015第31周日
查看>>
在使用EF开发时候,遇到 using 语句中使用的类型必须可隐式转换为“System.IDisposable“ 这个问题。...
查看>>
Oracle 如何提交手册Cluster Table事务
查看>>
BeagleBone Black第八课板:建立Eclipse编程环境
查看>>
在服务器上用Fiddler抓取HTTPS流量
查看>>
文件类似的推理 -- 超级本征值(super feature)
查看>>
【XCode7+iOS9】http网路连接请求、MKPinAnnotationView自定义图片和BitCode相关错误--备用...
查看>>
各大公司容器云的技术栈对比
查看>>
记一次eclipse无法启动的排查过程
查看>>
【转】jmeter 进行java request测试
查看>>
读书笔记--MapReduce 适用场景 及 常见应用
查看>>
SignalR在Xamarin Android中的使用
查看>>
Eclipse和MyEclipse使用技巧--Eclipse中使用Git-让版本管理更简单
查看>>
[转]响应式表格jQuery插件 – Responsive tables
查看>>