三种二叉树的后序遍历的方法:
1. 递归 O(n) 时间复杂度, O(n) 空间复杂度
2. 迭代(用栈) O(n) 时间复杂度, O(n) 空间复杂度
3. Morris 后序遍历 O(n) 时间复杂度, O(1) 空间复杂度
关于 Morris 中序遍历见 http://blog.csdn.net/shoulinjun/article/details/19051503
void PreOrderVisitMorris(TreeNode *root)
{
TreeNode *pre(NULL);
while(root)
{
if(root->left_child == NULL){
cout << root->value << " ";
root = root->right_child;
continue;
}
//find the precessor of root
TreeNode *node = root->left_child;
for(; node->right_child && node->right_child != root; node = node->right_child);
//第一次访问
if(node->right_child == NULL){
node->right_child = root; //建立线索
cout << root->value << " ";
root = root->left_child;
}
else{
node->right_child = NULL;
root = root->right_child;
}
}
}