首页 > 代码库 > 非递归遍历二叉树【层次遍历,先序、中序、后序遍历】

非递归遍历二叉树【层次遍历,先序、中序、后序遍历】

一、层次遍历:借助队列实现

 1 void LevelOrderTraversal(BiTree root) 2 { 3     BiTree e = root;//从根节点开始 4     Queue *q; 5     InitQueue(q); 6      7     if(e)//若根结点非空,则入队列  8     { 9         EnQueue(q,e);10     }11 12     while(!QueueEmpty(q))13     {14         DelQueue(q,e);    15         Visit(e);16         if(e->leftChild)//左孩子不空,入队列 17         {18             EnQueue(q,e->leftChild);19         }20         if(e->rightChild)//右孩子不空,入队列 21         {22             EnQueue(q,e->rightChild);23         }24     } 25 }        

二、先序、中序、后序遍历:借助栈实现

(1)先序遍历

void PreorderTranversal(BiTree root){    Stack *s;    InitStack(s); //栈底指针    BiTree e = root;  //根节点    while(e!=null || !StackEmpty(s)){        while(e!=null){            visit(e);            Push(s,e);//入栈            e= e->leftChild;        }                if(!StackEmpty(s)){          GetTop(s,e);          visit(e);          Pop (s,e);//出栈              e =e->rightChild;//在此以右节点为根节点循环以上过程        }    }    

(2)中序遍历

 1 void InorderTranversal(BiTree root){ 2     Stack *s; 3     InitStack(s); //栈底指针 4     BiTree e = root;  //根节点 5     while(e!=null || !StackEmpty(s)){ 6         while(e!=null){ 7             Push(s,e);//入栈 8             e= e->leftChild; 9         }10     11             if(!StackEmpty(s)){12             GetTop(s,e);13             visit(e);14             Pop (s,e);//出栈    15             e =e->rightChild;//在此以右节点为根节点循环以上过程16         }17 }

(3)后序遍历

 1 typedef struct AssistNode{ 2     BiTree bi; 3     int isFirst= false;//表示是第一次还是第二次出栈 4 }*Assist; 5  6 void PostorderTranversal(BiTree root){ 7     //此处Stack结构中的元素为Assist类型 8     Stack *s; 9     InitStack(s); //栈底指针10     BiTree e = root;  //根节点11     while(e!=null || !StackEmpty(s)){12         while(e!=null){13              Assist assist=(Assist*)malloc(sizeof(Assist));14             //将e封装到assist里面并加标记15             assist->bi= e;16             assist->isFirst= true;17             Push(s,assist);//入栈18             e= e->leftChild;19         }20     21         if(!StackEmpty(s)){22             GetTop(s,assist);23             Pop (s,assist);//出栈24             if(assist->isFirst=true){25                             //如果是第一次取出,则以该节点作为根节点循环26                 assist->isFirst=false;27                 Push(s,assist);28                 e=assist->bi->rightChild;29             }else{30                             //如果是第二次取出,则访问,并在下个循环中向上一级访问(取出的新的节点为其父节点)31                     visit(assist->bi);32                 e=null;33              }34         }35 }       

 

非递归遍历二叉树【层次遍历,先序、中序、后序遍历】