非递归遍历二叉树

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

 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);
          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 }       

 

posted @ 2014-11-18 22:11  kv_is_a_nlper  阅读(188)  评论(0编辑  收藏  举报