当前位置:   article > 正文

二叉树的非递归遍历(前序,后序,中序,层序)_二叉树层序遍历非递归

二叉树层序遍历非递归

目录

一.先序遍历 

二.中序遍历

三.后序遍历 

四.层序遍历 


二叉树的遍历是指访问树中的每一个结点元素,且每个结点元素被访问一次。二叉树的遍历分为以下四种方法:

(1)先序遍历:先访问根结点,然后访问左子树,最后访问右子树。

(2)中序遍历:先访问左子树,然后访问根结点,最后访问右子树。

(3)后序遍历:先访问左子树,然后访问右子树,最后访问根结点。

(4)层序遍历:二叉树层序遍历,又称为广度优先遍历,其节点访问按照二叉树的层次,从第一层根结点开始向下逐层访问每层结点,同层结点按照从左到右的规则顺序访问。

给出一棵树:

一.先序遍历 

 那么先序遍历的顺序是:FCADBEHGM

在用代码建立的过程是:

(1)遇到一个结点,先输出,再把它压栈,并去遍历它的左子树。

(2)当左子树遍历结束后,从栈顶弹出这个结点。

(3)然后按其右指针再去先序遍历它的右子树。

先序遍历的代码如下:

  1. void preorder(Bintree BT)
  2. {
  3. stack s;
  4. Bintree PT=BT;
  5. s=createstack(s);//先向左
  6. while(PT||s->top!=-1){
  7. while(PT){
  8. printf("%c",PT->data);
  9. instack(s,PT);
  10. PT=PT->left;
  11. }
  12. if(s->top!=-1){
  13. PT=popstack(s);
  14. PT=PT->right;
  15. }
  16. }
  17. }

代码解读:由于先序遍历的顺序是根左右,所以先访问根结点F,并把F压入栈,继续遍历F的左子树,并输出压栈,此时栈里面的元素有:F,C,A;但A的左节点是空,所以退出循环,开始弹出栈顶元素,访问栈顶元素的右子树,即A的右子树,为空,再继续重复操作。便可以访问到它的每一个元素。

二.中序遍历

中序遍历的顺序是:ACBDFHEMG

代码建立的过程是:

(1)遇到一个结点,就把它压入栈,并去遍历它的左子树。

(2)当左子树遍历结束后,从栈顶弹出这个结点,并输出它。

(3)然后按其右指针再去中序遍历该结点的右子树。

中序遍历的代码如下:

  1. void preorder(Bintree BT)
  2. {
  3. stack s;
  4. Bintree PT=BT;
  5. s=createstack(s);
  6. while(PT||s->top!=-1){
  7. while(PT){
  8. instack(s,PT);
  9. PT=PT->left;
  10. }
  11. if(s->top!=-1){
  12. PT=popstack(s);
  13. printf("%c",PT->data);
  14. PT=PT->right;
  15. }
  16. }
  17. }

三.后序遍历 

后序遍历的顺序是:ABDCHMGEF

得知后序遍历,我们可以知道逆后序遍历的顺序为:FEGMHCDBA,对比于前序遍历的根左右来说,逆后序遍历为根右左。则就需要调换一下左右子树便可以实现逆后序遍历的操作,但是我们得到的结果是逆后序倒置过来的结果,我们可以设置两个堆栈,也可以设置一个数组。下面我们看代码:

  1. void postorder(Bintree BT)
  2. {
  3. stack s;
  4. char ch[maxsize];
  5. Bintree PT=BT;
  6. int i=0,j;
  7. s=createstack(s);
  8. while(PT||s->top!=-1){
  9. while(PT){
  10. ch[i++]=PT->data;
  11. instack(s,PT);
  12. PT=PT->right;
  13. }
  14. if(s->top!=-1){
  15. PT=popstack(s);
  16. PT=PT->left;
  17. }
  18. }
  19. ch[i]='\0';
  20. for(j=i-1;j>=0;j--)
  21. printf("%c",ch[j]);
  22. }

四.层序遍历 

层序遍历二叉树的具体算法执行步骤如下:

(1).初始化队列为空

(2).从队列中取出一个元素,访问该元素所指结点

(3).若该元素所指结点的左右孩子结点非空,则将其左,右孩子的指针顺序入队。

代码如下:

  1. void cengxu(Bintree BT)
  2. {
  3. queue Q;
  4. Bintree PT=BT;
  5. if(BT==NULL)
  6. return;
  7. Q=createqueue(Q);
  8. enqueue(Q,PT);
  9. while(Q->front!=Q->rear){
  10. PT=deletequeue(Q);
  11. printf("%c",PT->data);
  12. if(PT->left!=NULL)
  13. enqueue(Q,PT->left);
  14. if(PT->right!=NULL)
  15. enqueue(Q,PT->right);
  16. }
  17. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号