二叉树遍历的非递归版本除了可以使用 stack 外, 见 http://blog.csdn.net/shoulinjun/article/details/19089155
还可以采用 parent 指针和标记来实现。
二叉树节点的数据结构如下:
/** * struct TreeNode * { * char value; * TreeNode *parent; * TreeNode *left_child; * TreeNode *right_child; * bool visited; //标记是否已访问 * }; */
void PreOrderVisitNoStack(TreeNode * root)//非递归,不用栈 { while(root != NULL) { if(!root->visited){ cout << root->value << " "; root->visited = true; } while(root->left_child && !root->left_child->visited) { root = root->left_child; cout << root->value << " "; root->visited = true; } if(root->right_child !=NULL && !root->right_child->visited) { root = root->right_child; } else root = root->parent; } }
void InOrderVisitNoStack(TreeNode * root) { while(root != NULL) { while(root->left_child && !root->left_child->visited) { root = root->left_child; } if(!root->visited) { cout << root->value << " "; root->visited = true; } if(root->right_child !=NULL && !root->right_child->visited) { root = root->right_child; } else root = root->parent; } }
void PostOrderVisitNoStack(TreeNode *root) { while(root) { while(root->left_child && !root->left_child->visited){ root = root->left_child; } //右子树未访问 if(root->right_child && !root->right_child->visited){ root = root->right_child; } else{ cout << root->value << " "; root->visited = true; root = root->parent; } } }
原文:http://blog.csdn.net/shoulinjun/article/details/19113367