树的遍历

来源:互联网 发布:知乎 代购 吐槽 编辑:程序博客网 时间:2024/05/21 22:21

1、树的前  中 后 序遍历:

树的前 中 后是相对树的根而言的,如前序遍历的次序是根、左子树、右子树;遍历算法分递归和非递归:

递归遍历:

  1. //先序遍历  
  2. void PreOrder(BiTree T){  
  3.     if(T != NULL){  
  4.         //访问根节点  
  5.         Visit(T);  
  6.         //访问左子结点  
  7.         PreOrder(T->lchild);  
  8.         //访问右子结点  
  9.         PreOrder(T->rchild);  
  10.     }  
  11. }  
  12. //中序遍历  
  13. void InOrder(BiTree T){  
  14.     if(T != NULL){  
  15.         //访问左子结点  
  16.         InOrder(T->lchild);  
  17.         //访问根节点  
  18.         Visit(T);  
  19.         //访问右子结点  
  20.         InOrder(T->rchild);  
  21.     }  
  22. }  
  23. //后序遍历  
  24. void PostOrder(BiTree T){  
  25.     if(T != NULL){  
  26.         //访问左子结点  
  27.         PostOrder(T->lchild);  
  28.         //访问右子结点  
  29.         PostOrder(T->rchild);  
  30.         //访问根节点  
  31.         Visit(T);  
  32.     }  
  33. }  

非递归遍历:

前序遍历:

  1. /* 先序遍历(非递归) 
  2.    思路:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。 
  3. */  
  4. void PreOrder2(BiTree T){  
  5.     stack<BiTree> stack;  
  6.     //p是遍历指针  
  7.     BiTree p = T;  
  8.     //栈不空或者p不空时循环  
  9.     while(p || !stack.empty()){  
  10.         if(p != NULL){  
  11.             //存入栈中  
  12.             stack.push(p);  
  13.             //访问根节点  
  14.             printf("%c ",p->data);  
  15.             //遍历左子树  
  16.             p = p->lchild;  
  17.         }  
  18.         else{  
  19.             //退栈  
  20.             p = stack.top();  
  21.             stack.pop();  
  22.             //访问右子树  
  23.             p = p->rchild;  
  24.         }  
  25.     }//while  
  26. }  

中序遍历:

  1. void InOrder2(BiTree T){  
  2.     stack<BiTree> stack;  
  3.     //p是遍历指针  
  4.     BiTree p = T;  
  5.     //栈不空或者p不空时循环  
  6.     while(p || !stack.empty()){  
  7.         if(p != NULL){  
  8.             //存入栈中  
  9.             stack.push(p);  
  10.             //遍历左子树  
  11.             p = p->lchild;  
  12.         }  
  13.         else{  
  14.             //退栈,访问根节点  
  15.             p = stack.top();  
  16.             printf("%c ",p->data);  
  17.             stack.pop();  
  18.             //访问右子树  
  19.             p = p->rchild;  
  20.         }  
  21.     }//while  
  22. }  

后序遍历:


  1. //后序遍历(非递归)  
  2. typedef struct BiTNodePost{  
  3.     BiTree biTree;  
  4.     char tag;  
  5. }BiTNodePost,*BiTreePost;  
  6.   
  7. void PostOrder2(BiTree T){  
  8.     stack<BiTreePost> stack;  
  9.     //p是遍历指针  
  10.     BiTree p = T;  
  11.     BiTreePost BT;  
  12.     //栈不空或者p不空时循环  
  13.     while(p != NULL || !stack.empty()){  
  14.         //遍历左子树  
  15.         while(p != NULL){  
  16.             BT = (BiTreePost)malloc(sizeof(BiTNodePost));  
  17.             BT->biTree = p;  
  18.             //访问过左子树  
  19.             BT->tag = 'L';  
  20.             stack.push(BT);  
  21.             p = p->lchild;  
  22.         }  
  23.         //左右子树访问完毕访问根节点  
  24.         while(!stack.empty() && (stack.top())->tag == 'R'){  
  25.             BT = stack.top();  
  26.             //退栈  
  27.             stack.pop();  
  28.             BT->biTree;  
  29.             printf("%c ",BT->biTree->data);  
  30.         }  
  31.         //遍历右子树  
  32.         if(!stack.empty()){  
  33.             BT = stack.top();  
  34.             //访问过右子树  
  35.             BT->tag = 'R';  
  36.             p = BT->biTree;  
  37.             p = p->rchild;  
  38.         }  
  39.     }//while  
  40. }  



2、树的深度遍历与广度遍历:

//深度优先遍历
void depthFirstSearch(Tree root){
    stack
<Node *> nodeStack;  //使用C++的STL标准模板库
    nodeStack.push(root);
    Node 
*node;
    
while(!nodeStack.empty()){
        node 
= nodeStack.top();
        printf(format, node
->data);  //遍历根结点
        nodeStack.pop();
        
if(node->rchild){
            nodeStack.push(node
->rchild);  //先将右子树压栈
        }
        
if(node->lchild){
            nodeStack.push(node
->lchild);  //再将左子树压栈
        }
    }
}



//广度优先遍历
void breadthFirstSearch(Tree root){
    queue
<Node *> nodeQueue;  //使用C++的STL标准模板库
    nodeQueue.push(root);
    Node 
*node;
    
while(!nodeQueue.empty()){
        node 
= nodeQueue.front();
        nodeQueue.pop();
        printf(format, node
->data);
        
if(node->lchild){
            nodeQueue.push(node
->lchild);  //先将左子树入队
        }
        
if(node->rchild){
            nodeQueue.push(node
->rchild);  //再将右子树入队
        }
    }
}


本文摘自:http://blog.csdn.net/sjf0115/article/details/8645991

http://www.blogjava.net/fancydeepin/archive/2013/02/03/395073.html

0 0