为什么要把先序和后序放在一起写,因为他们思路很相似啊
1.先序非递归:
1-1.定义一个栈
1-2.树根入栈
1-3.若栈不为空,栈顶出栈,访问栈顶,右孩子入栈,左孩子入栈(后入栈的先出,所以左孩子后入栈)
1-4 一直循环,直到栈空
void PreOrderUnrecursionTraverse(BiTree T) { if (T == NULL) return; //若树根为NULL,return BiTNode *stack[Maxsize]; //创建一个栈 int top = -1; BiTNode *p = NULL; //定义一个指针p来遍历树 stack[++top] = T; //树根入栈 while(top != -1) { p = stack[top]; //访问栈顶并出栈 printf("%c",p->data); --top; if(p->rchild != NULL) //右子树入栈 { stack[++top] = p->rchild; } if(p->lchild != NULL) //左子树入栈 { stack[++top] = p->lchild; } } }
2.后序非递归
先序的访问次序是根左右,而访问次序为跟右左时,得到的是后序遍历的逆序,再加一个栈把它颠倒即可。
2-1. 创建stack1 用于树的根右左遍历,创建stack2用于颠倒逆序
2-2. 定义一个指针p,用于遍历
2-3.根入栈stack1
2-3。若栈顶不为空,出栈到stack2,左子树入栈,右子树入栈(循环直到栈空)
3-4。stack2 出栈并访问
void PostOrderUncursionTraverse(BiTree T) { BiTNode *stack1[Maxsize]; //创建栈stack1,用于根右左遍历 int top1 = -1; BiTNode *stack2[Maxsize]; //创建stack2,以后逆序倒后序序列 int top2 =-1; BiTNode *p = NULL; //创建指针p,辅助遍历树 stack1[++top1] = T; //树根入栈stack1 while(top1 > -1) //stack1不为空时,stack1的栈顶出栈stack1,入栈stack2 { p = stack1[top1]; stack2[++top2] = p; --top1; if(p->lchild != NULL) //左孩子不为空,入栈 { stack1[++top1] = p->lchild; } if(p->rchild != NULL) //右孩子不为空,入栈 { stack1[++top1] = p->rchild; } } while(top2 > -1) //stack2出栈,得到后序遍历序列 { p = stack2[top2]; printf("%c",p->data); --top2; } }