用栈和递归写的就不用贴过来了,那个我已经知道了,现在我只要不用栈实现的的!

类似于这样的:
void preorder(BiTree T)//先序遍历
{
BiTree s[100];
int top=0;
while(T||top)
{
while(T)
{
s[++top]=T;
putchar(s[top]->data);
T=T->lchild;
}
if(top)
{
T=s[top--]->rchild;
}
}
}

斯蒂芬大帝
浏览 205回答 2
2回答

SMILET

以下是我写的二叉树的头文件,有你想要的(不失一般性,我用的是模板).里面有非递归后序遍历&nbsp;.栈和队列的头文件也在.用main()举了一个例子,自己看吧.&nbsp;//****************BiTree.h&nbsp;#ifndef&nbsp;B_I_T_R_E_E&nbsp;#define&nbsp;B_I_T_R_E_E&nbsp;#include&nbsp;<iostream>&nbsp;//#include&nbsp;<conio.h>&nbsp;#include&nbsp;"stack.h"&nbsp;#include&nbsp;"Lqueue.h"&nbsp;using&nbsp;namespace&nbsp;std;&nbsp;template&nbsp;<class&nbsp;TElemType>&nbsp;struct&nbsp;BiTNode{&nbsp;TElemType&nbsp;data;&nbsp;BiTNode<TElemType>&nbsp;*lchild,*rchild;&nbsp;};&nbsp;template&nbsp;<class&nbsp;TElemType>&nbsp;class&nbsp;BiTree&nbsp;{&nbsp;public:&nbsp;void&nbsp;CreateBiTree(BiTNode<TElemType>&nbsp;*&T);&nbsp;void&nbsp;PreOrderTraverse(BiTNode<TElemType>&nbsp;*T);&nbsp;void&nbsp;InOrderTraverse(BiTNode<TElemType>&nbsp;*T);&nbsp;void&nbsp;PostOrderTraverse(BiTNode<TElemType>&nbsp;*T);&nbsp;void&nbsp;LevelOrderTraverse(BiTNode<TElemType>&nbsp;*T);&nbsp;};&nbsp;template&nbsp;<class&nbsp;TElemType>&nbsp;void&nbsp;BiTree<TElemType>::CreateBiTree(BiTNode<TElemType>&nbsp;*&T)&nbsp;{&nbsp;TElemType&nbsp;ch;&nbsp;cout&nbsp;<<&nbsp;"请输入数据(-1表示空(非字符型)):"&nbsp;<<&nbsp;endl;&nbsp;cin&nbsp;>>&nbsp;ch;&nbsp;if(ch&nbsp;==&nbsp;-1)&nbsp;T&nbsp;=&nbsp;NULL;&nbsp;else&nbsp;{&nbsp;if(!(T&nbsp;=&nbsp;(BiTNode<TElemType>&nbsp;*)malloc(sizeof(BiTNode<TElemType>))))&nbsp;exit(0);&nbsp;T->data&nbsp;=&nbsp;ch;&nbsp;CreateBiTree(T->lchild);&nbsp;CreateBiTree(T->rchild);&nbsp;}&nbsp;}&nbsp;template&nbsp;<class&nbsp;TElemType>&nbsp;//递归先序遍历&nbsp;void&nbsp;BiTree<TElemType>::PreOrderTraverse(BiTNode<TElemType>&nbsp;*T)&nbsp;{&nbsp;if(T)&nbsp;{&nbsp;cout&nbsp;<<&nbsp;T->data&nbsp;<<&nbsp;endl;&nbsp;PreOrderTraverse(T->lchild);&nbsp;PreOrderTraverse(T->rchild);&nbsp;}&nbsp;}&nbsp;//PreOrderTraverse&nbsp;/*非递归先序遍历&nbsp;void&nbsp;BiTree<TElemType>::PreOrderTraverse(BiTNode<TElemType>&nbsp;*T)&nbsp;{&nbsp;BiTNode<TElemType>&nbsp;*&nbsp;p&nbsp;=&nbsp;T;&nbsp;stack<BiTNode<TElemType>&nbsp;*>&nbsp;S;&nbsp;S.InitStack();&nbsp;while(p&nbsp;||&nbsp;!S.StackEmpty())&nbsp;{&nbsp;if(p)&nbsp;{&nbsp;S.Push(p);&nbsp;cout&nbsp;<<&nbsp;p->data&nbsp;<<&nbsp;endl;&nbsp;p&nbsp;=&nbsp;p->lchild;&nbsp;}&nbsp;else&nbsp;{&nbsp;S.Pop(p);&nbsp;p&nbsp;=&nbsp;p->rchild;&nbsp;}&nbsp;}&nbsp;S.DestroyStack();&nbsp;}&nbsp;*/&nbsp;//递归中序遍历&nbsp;template&nbsp;<class&nbsp;TElemType>&nbsp;void&nbsp;BiTree<TElemType>::InOrderTraverse(BiTNode<TElemType>&nbsp;*T)&nbsp;{&nbsp;if(T)&nbsp;{&nbsp;InOrderTraverse(T->lchild);&nbsp;cout&nbsp;<<&nbsp;T->data&nbsp;<<&nbsp;endl;&nbsp;InOrderTraverse(T->rchild);&nbsp;}&nbsp;}&nbsp;//非递归中序遍历&nbsp;/*void&nbsp;BiTree<TElemType>::InOrderTraverse(BiTNode<TElemType>&nbsp;*T)&nbsp;{&nbsp;BiTNode<TElemType>&nbsp;*&nbsp;p&nbsp;=&nbsp;T;&nbsp;stack<BiTNode<TElemType>&nbsp;*>&nbsp;S;&nbsp;S.InitStack();&nbsp;while(p&nbsp;||&nbsp;!S.StackEmpty())&nbsp;{&nbsp;if(p)&nbsp;{&nbsp;S.Push(p);&nbsp;p&nbsp;=&nbsp;p->lchild;&nbsp;}&nbsp;else&nbsp;{&nbsp;S.Pop(p);&nbsp;cout&nbsp;<<&nbsp;p->data&nbsp;<<&nbsp;endl;&nbsp;p&nbsp;=&nbsp;p->rchild;&nbsp;}&nbsp;}&nbsp;S.DestroyStack();&nbsp;}&nbsp;*/&nbsp;//递归后序遍历&nbsp;template&nbsp;<class&nbsp;TElemType>&nbsp;void&nbsp;BiTree<TElemType>::PostOrderTraverse(BiTNode<TElemType>&nbsp;*T)&nbsp;{&nbsp;if(T)&nbsp;{&nbsp;PostOrderTraverse(T->lchild);&nbsp;PostOrderTraverse(T->rchild);&nbsp;cout&nbsp;<<&nbsp;T->data&nbsp;<<&nbsp;endl;&nbsp;}&nbsp;}&nbsp;//非递归后序遍历&nbsp;/*void&nbsp;BiTree<TElemType>::PostOrderTraverse(BiTNode<TElemType>&nbsp;*T)&nbsp;{&nbsp;BiTNode<TElemType>&nbsp;*&nbsp;p&nbsp;=&nbsp;T;&nbsp;BiTNode<TElemType>&nbsp;*&nbsp;q&nbsp;=&nbsp;NULL;&nbsp;stack<BiTNode<TElemType>&nbsp;*>&nbsp;S;&nbsp;S.InitStack();&nbsp;S.Push(p);&nbsp;p&nbsp;=&nbsp;p->lchild;&nbsp;while(!S.StackEmpty())&nbsp;{&nbsp;if(p)&nbsp;{S.Push(p);p&nbsp;=&nbsp;p->lchild;}&nbsp;else&nbsp;{&nbsp;S.GetTop(p);&nbsp;p&nbsp;=&nbsp;p->rchild;&nbsp;if(!p)&nbsp;{&nbsp;S.Pop(p);&nbsp;cout&nbsp;<<&nbsp;p->data&nbsp;<<&nbsp;endl;&nbsp;S.GetTop(q);&nbsp;while(q&nbsp;&&&nbsp;p&nbsp;==&nbsp;q->rchild)&nbsp;{&nbsp;S.Pop(p);&nbsp;cout&nbsp;<<&nbsp;p->data&nbsp;<<&nbsp;endl;&nbsp;S.GetTop(q);&nbsp;//if(q&nbsp;==&nbsp;NULL)&nbsp;break;&nbsp;}&nbsp;if(q)&nbsp;{&nbsp;S.GetTop(q);&nbsp;p&nbsp;=&nbsp;q->rchild;&nbsp;}&nbsp;}&nbsp;}&nbsp;}&nbsp;S.DestroyStack();&nbsp;}&nbsp;*/&nbsp;//非递归层次遍历&nbsp;template&nbsp;<class&nbsp;TElemType>&nbsp;void&nbsp;BiTree<TElemType>::LevelOrderTraverse(BiTNode<TElemType>&nbsp;*T)&nbsp;{&nbsp;Lqueue<BiTNode<TElemType>&nbsp;*>&nbsp;que;&nbsp;que.InitQueue();&nbsp;if(T)&nbsp;que.EnQueue(T);&nbsp;while(!que.QueueEmpty())&nbsp;{&nbsp;que.GetHead(T);&nbsp;if(T->lchild)&nbsp;que.EnQueue(T->lchild);&nbsp;if(T->rchild)&nbsp;que.EnQueue(T->rchild);&nbsp;que.DeQueue(T);&nbsp;cout&nbsp;<<&nbsp;T->data&nbsp;<<&nbsp;endl;&nbsp;}&nbsp;que.DestroyQueue();&nbsp;}&nbsp;#endif&nbsp;//**************BiTree.h&nbsp;//****Lqueue.h&nbsp;#ifndef&nbsp;_LQUEUE_H&nbsp;#define&nbsp;_LQUEUE_H&nbsp;#define&nbsp;MAXQSIZE&nbsp;100&nbsp;typedef&nbsp;int&nbsp;Status;&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;class&nbsp;Lqueue&nbsp;{&nbsp;public:&nbsp;void&nbsp;InitQueue();&nbsp;void&nbsp;DestroyQueue();&nbsp;void&nbsp;ClearQueue();&nbsp;Status&nbsp;QueueEmpty();&nbsp;Status&nbsp;QueueLength();&nbsp;void&nbsp;GetHead(QElemType&nbsp;&&nbsp;e);&nbsp;void&nbsp;EnQueue(QElemType&nbsp;e);&nbsp;void&nbsp;DeQueue(QElemType&nbsp;&&nbsp;e);&nbsp;private:&nbsp;struct&nbsp;SqQueue&nbsp;{&nbsp;QElemType&nbsp;*&nbsp;base;&nbsp;int&nbsp;front;&nbsp;int&nbsp;rear;&nbsp;};&nbsp;SqQueue&nbsp;Q;&nbsp;};&nbsp;//********Lqueue.cpp********&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;Lqueue<QElemType>::InitQueue()&nbsp;{&nbsp;Q.base&nbsp;=&nbsp;(QElemType&nbsp;*)malloc(MAXQSIZE&nbsp;*&nbsp;sizeof(QElemType));&nbsp;if(!Q.base)&nbsp;exit(0);&nbsp;Q.front&nbsp;=&nbsp;Q.rear&nbsp;=&nbsp;0;&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;Lqueue<QElemType>::DestroyQueue()&nbsp;{&nbsp;free(Q.base);&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;Lqueue<QElemType>::ClearQueue()&nbsp;{&nbsp;Q.front&nbsp;=&nbsp;Q.rear&nbsp;=&nbsp;0;&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;Status&nbsp;Lqueue<QElemType>::QueueEmpty()&nbsp;{&nbsp;if(Q.front&nbsp;==&nbsp;Q.rear)&nbsp;return&nbsp;1;&nbsp;return&nbsp;0;&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;Status&nbsp;Lqueue<QElemType>::QueueLength()&nbsp;{&nbsp;return&nbsp;(Q.rear&nbsp;-&nbsp;Q.front&nbsp;+&nbsp;MAXQSIZE)%MAXQSIZE;&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;Lqueue<QElemType>::GetHead(QElemType&nbsp;&&nbsp;e)&nbsp;{&nbsp;if(Q.front&nbsp;==&nbsp;Q.rear)&nbsp;e&nbsp;=&nbsp;NULL;&nbsp;else&nbsp;{&nbsp;e&nbsp;=&nbsp;Q.base[Q.front];&nbsp;}&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;Lqueue<QElemType>::EnQueue(QElemType&nbsp;e)&nbsp;{&nbsp;if((Q.rear&nbsp;+&nbsp;1)%MAXQSIZE&nbsp;==&nbsp;Q.front)&nbsp;cout&nbsp;<<&nbsp;"ERROR"&nbsp;<<&nbsp;endl;&nbsp;else&nbsp;{&nbsp;Q.base[Q.rear]&nbsp;=&nbsp;e;&nbsp;Q.rear&nbsp;=&nbsp;(Q.rear&nbsp;+&nbsp;1)%MAXQSIZE;&nbsp;}&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;Lqueue<QElemType>::DeQueue(QElemType&nbsp;&&nbsp;e)&nbsp;{&nbsp;if(Q.front&nbsp;==&nbsp;Q.rear)&nbsp;cout&nbsp;<<&nbsp;"ERROR"&nbsp;<<&nbsp;endl;&nbsp;else&nbsp;{&nbsp;e&nbsp;=&nbsp;Q.base[Q.front];&nbsp;Q.front&nbsp;=&nbsp;(Q.front&nbsp;+&nbsp;1)%MAXQSIZE;&nbsp;}&nbsp;}&nbsp;//******************Lqueue.cpp***************&nbsp;#endif&nbsp;//*****Lqueue.h********&nbsp;//*****stack.h&nbsp;#ifndef&nbsp;_STACK_H&nbsp;#define&nbsp;_STACK_H&nbsp;#define&nbsp;STACK_INIT_SIZE&nbsp;100&nbsp;#define&nbsp;STACKINCREMENT&nbsp;10&nbsp;typedef&nbsp;int&nbsp;Status;&nbsp;template<class&nbsp;QElemType>&nbsp;class&nbsp;stack&nbsp;{&nbsp;public:&nbsp;void&nbsp;InitStack();&nbsp;void&nbsp;DestroyStack();&nbsp;void&nbsp;ClearStack();&nbsp;Status&nbsp;StackEmpty();&nbsp;Status&nbsp;StackLength();&nbsp;void&nbsp;GetTop(QElemType&nbsp;&&nbsp;e);&nbsp;void&nbsp;Push(QElemType&nbsp;e);&nbsp;void&nbsp;Pop(QElemType&nbsp;&&nbsp;e);&nbsp;private:&nbsp;struct&nbsp;SqStack{&nbsp;QElemType&nbsp;*base;&nbsp;QElemType&nbsp;*top;&nbsp;int&nbsp;stacksize;&nbsp;}S;&nbsp;};&nbsp;//******stack.cpp------&nbsp;template<class&nbsp;QElemType>&nbsp;void&nbsp;stack<QElemType>::InitStack()&nbsp;{&nbsp;S.base&nbsp;=&nbsp;(QElemType&nbsp;*)malloc(STACK_INIT_SIZE&nbsp;*&nbsp;sizeof(QElemType));&nbsp;if(!S.base)&nbsp;exit(0);&nbsp;S.top&nbsp;=&nbsp;S.base;&nbsp;S.stacksize&nbsp;=&nbsp;STACK_INIT_SIZE;&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;stack<QElemType>::DestroyStack()&nbsp;{&nbsp;free(S.base);&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;stack<QElemType>::ClearStack()&nbsp;{&nbsp;S.top&nbsp;=&nbsp;S.base;&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;Status&nbsp;stack<QElemType>::StackEmpty()&nbsp;{&nbsp;if(S.top&nbsp;==&nbsp;S.base)&nbsp;return&nbsp;1;&nbsp;else&nbsp;return&nbsp;0;&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;Status&nbsp;stack<QElemType>::StackLength()&nbsp;{&nbsp;return&nbsp;(S.top&nbsp;-&nbsp;S.base);&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;stack<QElemType>::GetTop(QElemType&nbsp;&&nbsp;e)&nbsp;{&nbsp;if(S.top&nbsp;!=&nbsp;S.base)&nbsp;e&nbsp;=&nbsp;*(S.top&nbsp;-&nbsp;1);&nbsp;else&nbsp;e&nbsp;=&nbsp;NULL;&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;stack<QElemType>::Push(QElemType&nbsp;e)&nbsp;{&nbsp;if(S.top&nbsp;-&nbsp;S.base&nbsp;>=&nbsp;S.stacksize)&nbsp;{&nbsp;S.base&nbsp;=&nbsp;(QElemType&nbsp;*)realloc(S.base,(S.stacksize&nbsp;+&nbsp;STACKINCREMENT)&nbsp;*&nbsp;sizeof(QElemType));&nbsp;if(!S.base)&nbsp;exit(0);&nbsp;S.top&nbsp;=&nbsp;S.base&nbsp;+&nbsp;S.stacksize;&nbsp;S.stacksize&nbsp;+=&nbsp;STACKINCREMENT;&nbsp;}&nbsp;*S.top++&nbsp;=&nbsp;e;&nbsp;}&nbsp;template&nbsp;<class&nbsp;QElemType>&nbsp;void&nbsp;stack<QElemType>::Pop(QElemType&nbsp;&&nbsp;e)&nbsp;{&nbsp;if(S.top&nbsp;==&nbsp;S.base)&nbsp;e&nbsp;=&nbsp;NULL;&nbsp;else&nbsp;e&nbsp;=&nbsp;*&nbsp;--S.top;&nbsp;}&nbsp;//**********stack.cpp&nbsp;#endif&nbsp;//stack.h&nbsp;****&nbsp;//#include&nbsp;<iostream>&nbsp;#include&nbsp;"BiTree.h"&nbsp;//#include&nbsp;"stack.h"&nbsp;//#include&nbsp;"Lqueue.h"&nbsp;//using&nbsp;namespace&nbsp;std;&nbsp;int&nbsp;main()&nbsp;{&nbsp;BiTree<int>&nbsp;tree;&nbsp;BiTNode<int>&nbsp;*T&nbsp;=&nbsp;NULL;&nbsp;tree.CreateBiTree(T);&nbsp;tree.InOrderTraverse(T);&nbsp;tree.PreOrderTraverse(T);&nbsp;tree.PostOrderTraverse(T);&nbsp;tree.LevelOrderTraverse(T);&nbsp;return&nbsp;0;&nbsp;}&nbsp;新建3个头文件stack.h,Lqueue.h,BiTree.h&nbsp;分别将各个头文件的内容拷到相应的地方.&nbsp;新建C++&nbsp;Source&nbsp;file&nbsp;将main函数的内容拷入cpp文件.&nbsp;运行时如输入1,2,4,-1,-1,5,-1,-1,3,-1,-1&nbsp;相应的遍历结果会出现.

智慧大石

非递归实现后续遍历二叉树,此程序已调试成功:void postorder(BTree T){DataType s[100],sq;BTree p=T;int top=-1;while(p||top!=-1){while(p){top++;sq.flag=0;sq.node=p;s[top]=sq;p=p->lchild;}if(top!=-1){sq=s[top];p=sq.node;top--;if(sq.flag==0){sq.flag=1;top++;s[top]=sq;p=p->rchild;}else/*若第二次出栈,则输出该节点*/{printf("%c",sq.node->data);p=NULL;}}}}
打开App,查看更多内容
随时随地看视频慕课网APP