Morris遍历实现二叉树的前序、中序遍历比较简单,在这里做个笔记。后序遍历还在学习中,之后再做总结。
这里用到了 二叉树树的非递归建立。
#include <iostream>
#include <stack>
#include <string>
#include "tree.h"
using namespace std;
int main()
{
string s = "124##5##3##";
BiNode* root = addTree(s);
//printTree(root);
BiNode* cur = root;
BiNode* mostRight = NULL;
// Morris先序遍历
/*
while (cur != NULL)
{
mostRight = cur->left;
if (mostRight != NULL) // 有左子树
{
while (mostRight->right != NULL && mostRight->right != cur)
{
mostRight = mostRight->right; // 寻找最右左子树
}
if (mostRight->right == NULL) // 第一次访问节点
{
cout << cur->val;
mostRight->right = cur;
cur = cur->left;
continue;
}
else // 最有一次访问节点
{
mostRight->right = NULL;
}
}
else //没有左子树
{
cout << cur->val;
}
cur = cur->right;
}*/
// Morris中序遍历
/*
while (cur != NULL)
{
mostRight = cur->left;
if (mostRight != NULL) // 有左子树
{
while (mostRight->right != NULL && mostRight->right != cur)
{
mostRight = mostRight->right; // 寻找最右左子树
}
if (mostRight->right == NULL)
{
mostRight->right = cur;
cur = cur->left;
continue;
}
else
{
mostRight->right = NULL;
}
}
cout << cur->val;
cur = cur->right;
}
*/
system("pause");
return 0;
}