zoukankan      html  css  js  c++  java
  • 非递归遍历二叉树

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

     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 }       
  • 相关阅读:
    mongodb
    python中读取文件的read、readline、readlines方法区别
    uva 129 Krypton Factor
    hdu 4734
    hdu 5182 PM2.5
    hdu 5179 beautiful number
    hdu 5178 pairs
    hdu 5176 The Experience of Love
    hdu 5175 Misaki's Kiss again
    hdu 5174 Ferries Wheel
  • 原文地址:https://www.cnblogs.com/KevinHelloWorld/p/4106892.html
Copyright © 2011-2022 走看看