三种二叉树的后序遍历的方法:
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; } } }
原文:http://blog.csdn.net/shoulinjun/article/details/18731225