数据结构(27)二叉树的操作

来源:互联网 发布:js选中input内容 编辑:程序博客网 时间:2024/05/19 23:00

今天来介绍下二叉树的4种遍历方式,如果对二叉树不熟悉的话,请先去本系列二叉树的介绍中先学习。

 

遍历:单链表的遍历是指从第一个结点开始(下标为0的结点),按照某种次序依次访问每一个结点。
           二叉树的遍历是指从根结点开始,按照某种次序依次访问二叉树中的所有结点。

 

OK,下面就分别介绍前序遍历中序遍历后序遍历层次遍历

 

代码:

[cpp] view plaincopy
  1. void pre_order_traversal(BTreeNode* root)  
  2. {  
  3.     if(NULL != root)  
  4.     {  
  5.         printf("%c, ", ((Node*)root)->v);  
  6.           
  7.         pre_order_traversal(root->left);  
  8.         pre_order_traversal(root->right);  
  9.     }  
  10. }  


 

 

代码:

[cpp] view plaincopy
  1. void middle_order_traversal(BTreeNode* root)  
  2. {  
  3.     if(NULL != root)  
  4.     {  
  5.         middle_order_traversal(root->left);  
  6.           
  7.         printf("%c, ", ((Node*)root)->v);  
  8.           
  9.         middle_order_traversal(root->right);  
  10.     }  
  11. }  


 

 

代码:

[cpp] view plaincopy
  1. void post_order_traversal(BTreeNode* root)  
  2. {  
  3.     if(NULL != root)  
  4.     {  
  5.         post_order_traversal(root->left);  
  6.         post_order_traversal(root->right);  
  7.           
  8.         printf("%c, ", ((Node*)root)->v);  
  9.     }  
  10. }  


 

代码:

[cpp] view plaincopy
  1. void level_order_traversal(BTreeNode* root)  
  2. {  
  3.     if(NULL != root)  
  4.     {  
  5.         LinkQueue* queue = LinkQueue_Create();  
  6.           
  7.         if(NULL != queue)  
  8.         {  
  9.             LinkQueue_Append(queue, root);  
  10.               
  11.             while(0 < LinkQueue_Length(queue))  
  12.             {  
  13.                 Node* node = (Node*)LinkQueue_Retrieve(queue);  
  14.                   
  15.                 printf("%c, ", node->v);  
  16.                   
  17.                 LinkQueue_Append(queue, node->header.left);  
  18.                 LinkQueue_Append(queue, node->header.right);  
  19.             }  
  20.         }  
  21.           
  22.         LinkQueue_Destroy(queue);  
  23.     }  
  24. }  


  线索化二叉树指的是将二叉树中的结点进行逻辑意义上的“重排列”,使其可以线性的方式访问每一个结点。二叉树线索化之后每个结点都有一个线性下标,通过这个下标可以快速访问结点,而不需要遍历二叉树。

 

                   

           

            代码:

          

[cpp] view plaincopy
  1. void thread_via_left(BTreeNode* root, BTreeNode** pp)  
  2. {  
  3.     if((NULL!=root) && (NULL!=pp))  
  4.     {  
  5.         if(NULL != (*pp))  
  6.         {  
  7.             (*pp)->left = root;  
  8.             *pp = NULL;  
  9.         }     
  10.           
  11.         if(NULL == root->left)  
  12.         {  
  13.             *pp = root;  
  14.         }  
  15.           
  16.         thread_via_left(root->left, pp);  
  17.         thread_via_left(root->right, pp);  
  18.     }  
  19. }  


 

 

           代码:

           

[cpp] view plaincopy
  1. void thread_via_list(BTreeNode* root, SeqList* list)  
  2. {  
  3.     if((NULL!=root) && (NULL!=list))  
  4.     {  
  5.         SeqList_Insert(list, (SeqListNode*)root, SeqList_Length(list));  
  6.           
  7.         thread_via_list(root->left, list);  
  8.         thread_via_list(root->right, list);  
  9.     }  
  10. }  


 

           最后做一下小结:

 

               


0 0
原创粉丝点击