void NoRecursePreTraverse(BiTree tree){
stack<BiNode *> stack;
BiNode *node = tree;
while(node != NULL || !stack.empty()){
while(node != NULL){
cout << node->data <<" ";
stack.push(node);
node = node->lchild;
}
if(!stack.empty()){
node = stack.top();
node = node->rchild;
stack.pop();
}
}
}
void NoRecurseInTraverse(BiTree tree){
stack<BiNode *> stack;
BiNode *node = tree;
while(node != NULL || !stack.empty()){
while(node != NULL){
stack.push(node);
node = node->lchild;
}
if(!stack.empty()){
node = stack.top();
cout << node->data << " ";
stack.pop();
node = node->rchild;
}
}
}
struct BiTree_Flag{
BiNode *node;
bool flag;
};
void NoRecursePostTraverse(BiTree tree){
stack<BiTree_Flag> stack;
BiNode *node = tree;
BiTree_Flag node_flag;
while(node != NULL || !stack.empty()){
while(node != NULL){
node_flag.node = node;
node_flag.flag = false;
stack.push(node_flag);
node = node->lchild;
}
if(!stack.empty()){
node_flag = stack.top();
stack.pop();
if(node_flag.flag == false){
node_flag.flag = true;
stack.push(node_flag);
node = node_flag.node;
node = node->rchild;
}else{
cout << node_flag.node->data << " ";
}
}
}
}
思想:1)前序遍历:访问根节点,根节点放入栈中。访问左子树,如果左子数为空,栈弹出根节点,访问右子数。
2)中序遍历:根节点入栈,访问左子树。如果左子树为空,栈弹出根节点,访问根节点,访问右子树。
3)后续遍历:定义新的数据结构,为每一个节点定义一个标志位flag,false代表访问过一次,true代表访问过两次。
根节点入栈,flage设为FALSE。访问左子树。左子树为空,根节点弹出,如果flag为false,设为true,
访问右节点。如果为flag为true,访问该节点。
本文详细介绍了使用栈实现的非递归遍历二叉树的三种方式:前序、中序和后序遍历。通过定义特定的数据结构和算法流程,实现了遍历过程中的节点访问顺序控制。
2906

被折叠的 条评论
为什么被折叠?



