Morris则是使用时间换空间的思想,先来看看Morris中序遍历二叉树的算法实现:
/**
*morris中序遍历二叉树
*/
void morris_inorder(BiTree T) {
BNode *p, *temp;
p = T;
while(p) {
if(p->left == NULL) {
printf("%4c", p->ch);
p = p->right;
} else {
temp = p->left;
//找到左子树的最右子节点
while(temp->right != NULL && temp->right != p) {
temp = temp->right;
}
if(temp->right == NULL) {
temp->right = p;
p = p->left;
} else {
printf("%4c", p->ch);
temp->right = NULL;
p = p->right;
}
}
}
}
与Morris中序遍历相似,Morris先序遍历的代码如下:
void morris_preOrder(BiTree T) {
BNode *p = T, *temp;
while(p != NULL) {
if(p->left == NULL) {
printf("%4c",p->ch);
p = p->right;
} else {
temp = p->left;
while(temp->right != NULL && temp->right != p) {
temp = temp->right;
}
if(temp->right == NULL) {
printf("%4c", p->ch);
temp->right = p;
p = p->left;
} else {
temp->right = NULL;
p = p->right;
}
}
}
}