解释:点击打开链接
#include<string>
#include<vector>
#include<iostream>
#include<queue>
#include<unordered_set>
#include<algorithm>
#include<cassert>
#include<list>
#include<map>
#include<fstream>
#include<memory>
using namespace std;
struct bst_node
{
int key;
bst_node *left;
bst_node *right;
bst_node(int i):key(i),left(NULL),right(NULL) { }
};
void bst_morris_inorder(struct bst_node *root) {
struct bst_node *p = root, *tmp;//p指向当前子树的根节点
while (p) {
if (p->left == NULL) { //当前子树的左子树为空
printf("%d ", p->key);
p = p->right;
}
else { //当前子树的左子树不为空
tmp = p->left;
//tmp尝试将当前子树的左子树的最右孩子节点的后继结点设为p(保存后继信息)
while (tmp->right != NULL && tmp->right != p)
tmp = tmp->right;
if (tmp->right == NULL) {
tmp->right = p; //保存后继信息
p = p->left;
}
else { //这种情况说明由保存的后继信息回退到根节点再次尝试保存后继信息(说明左子树已访问过)
printf("%d ", p->key);
tmp->right = NULL; //还原
p = p->right;
}
}
}
}
int main ()
{
bst_node n1(1),n2(2),n3(3),n4(4),n5(5),n6(6);
n1.left=&n2,n1.right=&n3;
n2.left=&n4,n2.right=&n5;
n3.left=&n6;
bst_morris_inorder(&n1);
return 0;
}