Morris遍历二叉树
Morris遍历可以做到额外空间复杂度O(1),时间复杂度O(n)。
需要两个指针cur和mostringt
cur为当前节点
1.若cur没有左孩子 cur=cur->right
2.若cur有左孩子,找到左孩子的最右节点记为mostringt
若mostringt->right= =NULL,mostringt->right=cur , cur=cur->left
若mostringt->right= =cur , mostringt->right=NULL , cur=cur->right
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<climits>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;
typedef long long ll;
typedef struct Node
{
char data;
struct Node *left,*right;
}*node;
void createBiTree(node &t) //括号内的 BiTree &t等价于 BiTNode* &t
{
char c;
cin>>c;
if(c == '#')//当遇到 #时,令根节点为NULL,结束掉该分支的递归
t = NULL;
else
{
t = new Node;
t->data = c;
createBiTree(t->left);
createBiTree(t->right);
}
}
void morrisIn(node head)
{
if(NULL==head) return;
node cur=head;
node mostright=NULL;
while(NULL!=cur)
{
mostright=cur->left;
if(NULL!=mostright)
{
while(mostright->right!=NULL&&mostright->right!=cur)
mostright=mostright->right;
if(NULL==mostright->right)
{
mostright->right=cur;
cur=cur->left;
continue;
}
else
mostright->right=NULL;
}
cout<<cur->data<<" ";
cur=cur->right;
}
// cout<<endl;
}
void morrisPre(node head)
{
if(NULL==head) return;
node cur=head;
node mostright=NULL;
while(NULL!=cur)
{
mostright=cur->left;
if(NULL!=mostright)
{
while(mostright->right!=NULL&&mostright->right!=cur)
mostright=mostright->right;
if(NULL==mostright->right)
{
mostright->right=cur;
cout<<cur->data<<" ";
cur=cur->left;
continue;
}
else
mostright->right=NULL;
}
else
cout<<cur->data<<" ";
cur=cur->right;
}
// cout<<endl;
}
//逆序右边界
node reverseNode(node head)
{
node pre = NULL;
node next = NULL;
while(head != NULL)
{
next = head->right;
head->right = pre;
pre = head;
head = next;
}
return pre;
}
//逆序打印
void PrinRight(node head)
{
node lastNode=reverseNode(head);
node cur=lastNode;
while(cur!=NULL)
{
cout<<cur->data<<" ";
cur=cur->right;
}
reverseNode(lastNode);
}
void morrisback(node head)
{
if(NULL==head) return;
node cur=head;
node mostright=NULL;
while(NULL!=cur)
{
mostright=cur->left;
if(NULL!=mostright)
{
while(mostright->right!=NULL&&mostright->right!=cur)
mostright=mostright->right;
if(NULL==mostright->right)
{
mostright->right=cur;
cur=cur->left;
continue;
}
else
{
mostright->right=NULL;
PrinRight(cur->left);
}
}
cur=cur->right;
}
PrinRight(head);
// cout<<endl;
}
int main(void)
{
node head=NULL;
createBiTree(head);
//cout<<"前序遍历序列为:";
morrisPre(head);
cout<<endl;
//cout<<"中序遍历序列为:";
morrisIn(head);
cout<<endl;
//cout<<"后序遍历序列为:";
morrisback(head);
cout<<endl;
return 0;
}
//测试数据123##4##5##
感谢左神