# Morris Traversal算法遍历BST c实现

Morris Traversal本来是一种中续遍历的经典算法，相对于递归与使用椎的遍历。不需要额外的空间，也就是说空间复杂度为O(1)。
leetcode 中关于二叉树3种遍历方式的题，其中要求不能用递归。那么Morris就是一种可取的方案。

``````int* inorderTraversal(struct TreeNode* root, int* returnSize) {
int buff[255];
*returnSize=0;
struct TreeNode *cur=root;
struct TreeNode *prev=NULL;
while(cur){
if(cur->left){
prev=cur->left;
while(prev->right && prev->right!=cur)
prev=prev->right;

if(prev->right){
// just come from precessor
prev->right=NULL;
buff[*returnSize]=cur->val;
++(*returnSize);
cur=cur->right;
}else{
prev->right=cur;
cur=cur->left;
}

}else{
buff[*returnSize]=cur->val;
++(*returnSize);
cur=cur->right;
}
}
int bs=sizeof(int)*(*returnSize);
int *res=malloc(bs);

memcpy(res,buff,bs);
return res;
}``````

``````int* preorderTraversal(struct TreeNode* root, int* returnSize) {
int buff[255];
*returnSize=0;
struct TreeNode *cur=root;
struct TreeNode *prev=NULL;
while(cur){
if(cur->left){
prev=cur->left;
while(prev->right && prev->right!=cur)
prev=prev->right;

if(prev->right){
// just come from precessor
prev->right=NULL;
cur=cur->right;
}else{
prev->right=cur;
buff[*returnSize]=cur->val;
++(*returnSize);
cur=cur->left;
}

}else{
buff[*returnSize]=cur->val;
++(*returnSize);
cur=cur->right;
}
}
int bs=sizeof(int)*(*returnSize);
int *res=malloc(bs);

memcpy(res,buff,bs);
return res;
}``````

``````int* postorderTraversal(struct TreeNode* root, int* returnSize) {
int buff[255];
*returnSize=0;
struct TreeNode dump;
dump.left=root;
dump.right=NULL;
dump.val=0;
struct TreeNode *cur=&dump;
struct TreeNode *prev=NULL;
while(cur){
if(cur->left){
prev=cur->left;
while(prev->right && prev->right!=cur)
prev=prev->right;

if(prev->right){
// just come from precessor
struct TreeNode *p=cur->left;
int rn=0;
while(p!=cur){
buff[*returnSize]=p->val;
++(*returnSize);
p=p->right;
++rn;
}
//reverse right branch vals
int pt=*returnSize -1;
int ph=(*returnSize -rn);
while(pt>ph){
int tmp=buff[ph];
buff[ph]=buff[pt];
buff[pt]=tmp;
--pt;
++ph;
}
prev->right=NULL;
cur=cur->right;
}else{
prev->right=cur;
cur=cur->left;
}

}else{
cur=cur->right;
}
}
int bs=sizeof(int)*(*returnSize);
int *res=malloc(bs);

memcpy(res,buff,bs);
return res;
}``````

• 本文已收录于以下专栏：

## Morris二叉树遍历算法

• guimingyue
• 2014年03月21日 11:42
• 2721

## Morris方法遍历二叉树

• zhaoyunfullmetal
• 2015年08月29日 16:27
• 1797

## Morris算法进行二叉树遍历

• yangfeisc
• 2015年05月12日 19:45
• 1221

## 二叉树神级遍历算法——Morris遍历(C++版)

• u013575812
• 2015年11月27日 14:36
• 2424

## bst三种遍历及其他

#include #include //using stack; using namespace std; struct Node { int data; Node *left; Node...
• fall221
• 2013年09月10日 13:53
• 1188

## LeetCode 314. Binary Tree Vertical Order Traversal（二叉树垂直遍历）

• jmspan
• 2016年04月22日 02:19
• 2870

## 克努斯-莫里斯-普拉特算法(Knuth–Morris–Pratt algorithm) c简单实现

• baidu_27677097
• 2015年05月08日 18:43
• 629

## Binary Tree Preorder Traversal -- LeetCode

• linhuanmars
• 2014年03月18日 03:33
• 12897

## 算法练习笔记（七）——在BST树中的遍历

• d921737171
• 2017年03月31日 12:47
• 211

## Morris神级遍历二叉树，时间复杂度为O（1）

Morris算法介绍Morris算法在遍历的时候避免使用了栈结构，而是让下层到上层有指针，具体是通过底层节点指向NULL的空闲指针返回上层的某个节点，从而完成下层到上层的移动。我们知道二叉树有很多空闲...
• wy1550365215
• 2017年08月22日 14:44
• 310

举报原因： 您举报文章：Morris Traversal算法遍历BST c实现 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)