1、stackqueueusing namespace std;typedef int ElemType;typedef struct BiTreeNode ElemType data; struct BiTreeNode *lchild,*rchild;BiTNode,*BiTree;printlist(BiTree r) / 以广义表的形式输出二叉树 int i=1; if(r!=NULL) coutdata; printlist(r-lchild);rchild);) BiTree find(BiTree p,int pvalue) / 寻值 BiTree q; if(p=NULL) ret
2、urn(NULL); else if(p-data=pvalue) return(p); else q=find(p-lchild,pvalue); if(q=NULL) return(find(p-rchild,pvalue); else return(q);BiTree creat(BiTree &head) / 创建二叉树 int cvalue,i=1,pvalue,type; BiTree s,p,q;endl;请输入想要建立的二叉树的根结点: cincvalue; if(cvalue!=-1) head=(BiTree)malloc(sizeof(BiTNode); head-dat
3、a=cvalue;lchild=NULL;rchild=NULL; else do cout请输入第i+pvalue; if(pvalue! do couttype; while(type!=0&type!=1);请输入你想创建的结点: p=head; q=find(p,pvalue); if(q! s=(BiTree)malloc(sizeof(BiTNode); s- if(type=0) q-lchild=s; else q-rchild=s; else cout没有双亲结点! i-; while(pvalue!=-1); return(head);void LevelOrder(BiT
4、ree &T) /层序遍历 BiTree p=T; queue q; q.push(p); while(!q.empty() p=q.front();p-datalchild! q.push(p-rchild! void PreOrder(BiTree &T) /递归前序遍历 BiTNode *p=T; if(T! PreOrder(p-void InOrder(BiTree &T) /递归中序遍历 /递归中序遍历 InOrder(p-void PostOrder(BiTree &T) /递归后序遍历 PostOrder(p-void PreOrder2(BiTree &T) /非递归前序遍历
5、 stacklchild; p=s.top(); s.pop();rchild;void InOrder2(BiTree &T) /非递归中序遍历int main() BiTree p; creat(p);层序遍历: LevelOrder(p);递归前序遍历: PreOrder(p);递归中序遍历: InOrder(p);递归后序遍历: PostOrder(p);非递归前序遍历: PreOrder2(p);非递归中序遍历: InOrder2(p);用广义表显示的二叉树为: printlist(p); return 0;4、重要函数功能说明1、printlist(BiTree r) 以广义表的形
6、式输出二叉树函数2、BiTree find(BiTree p,int pvalue) 寻值函数3、BiTree creat(BiTree &head) 二叉树创建函数4、void LevelOrder(BiTree &T) 层序遍历函数5、void PreOrder(BiTree &T) 递归前序遍历函数6、void InOrder(BiTree &T) 递归中序遍历函数7、void PostOrder(BiTree &T) 递归后序遍历函数8、void PreOrder2(BiTree &T) 非递归前序遍历函数9、void InOrder2(BiTree &T) 非递归中序遍历函数5、程序
7、运行结果 建立的二叉树如下:六、实验中遇到的问题、解决及体会 1、刚开始,我不知道应该怎样建立二叉树,怎样将双亲与孩子联系起来,才能使程序运行时清晰明朗,不会使双亲与孩子的关系弄错,后来经过思考,我想到建立二叉树输入结点时可以提示要建立哪个双亲的孩子,从键盘输入双亲结点,就不会使其与孩子的关系弄错,同时选择0表示左孩子,1表示右孩子,这样一来如果之前,某个有左右孩子的双亲只建立了左孩子,而忘了建立右孩子,可以在后面进行补充,就使使用更方便了,并且最后输入-1,就表示二叉树建立结束。 比如:建立如上图所示二叉树,当我把1的左右孩子结点2、3建立后,我只建立了2的右孩子结点5,然后再建立了3的左右
8、孩子结点6、7,忘记了建立2的左孩子结点,但是我可以在最后建立2的左孩子结点4,这就使得程序更加方便灵活。2、老师要求用非递归算法编写前序遍历函数和中序遍历函数,还要以广义表的形式输出二叉树,起初我是完全没有想法的,于是我只好询问同学,同时还上网搜索相关信息,最终经过长时间的修改和多次调试,终于编写出了正确的程序可以实现老师要求的功能,这让我懂得在完全没有头绪的情况下,我们是可以寻求他人帮助和借助电脑等资源的。相关功能函数:程序运行部分截图:3、当我编写好能实现老师要求的所有功能的程序后,我多次运行程序,意外发现当我输入的结点值不是个位数时,遍历的结果很混乱,很不清楚,我意识到我遍历后的输出是直接一行连续输出所有结点,导致遍历结果不清楚,不知道到底是哪些结点值,于是我在每一次输出一个结点后,让其再输出一个空格,这样的话,遍历后输出的结果就很清晰明朗了。这让我懂得即使写好了程序,也要多次以不同的方式、形式运行程序,这样才能发现潜在的问题,对程序进行优化。修改前遍历函数中的输出都为“cout”,修改后遍历函数中的输出都为“cout”。建立的二叉树如下:修改前部分截图:修改后部分截图:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1