資料結構(C實現)------- 遍曆二叉樹

來源:互聯網
上載者:User

標籤:二叉樹的遍曆   二叉樹   遍曆   

        本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020

        二叉樹是另一中樹型結構,它的特點是每個結點至多隻有兩棵子樹(即二叉樹中不存在度大於2的結點),並且,二叉樹的子樹有左右之分,其次序不能任意顛倒。

        根據二叉樹的的遞迴定義可知,二叉樹是由3個基本單元組成,根結點、左子樹和右子樹,因此,若能依次遍曆這三部分,便是遍曆了整個二叉樹。假如以L、D、R分別表示遍曆左子樹、訪問根結點和遍曆右子樹,則可能有DLR、LDR、LRD、DRL、RDL、RLD這6種遍曆二叉樹的方案。若限定先左後右,則只有前3種情況,分別稱為先序遍曆、中序遍曆和後序遍曆,另外,還有一種遍曆方法,即從上到下,從左至右依次遍曆二叉樹的每個結點,稱之為層次遍曆。 故,共有4種遍曆二叉樹的方法。

二叉樹遍曆操作定義:
      1. 先序遍曆二叉樹的操作定義:

             若二叉樹為空白,則空操作;否則

                 1) 訪問根結點

                 2) 先序遍曆左子樹

                 3) 先序遍曆右子樹

      2. 中序遍曆二叉樹的操作定義:

              若二叉樹為空白,則空操作;否則

                 1) 中序遍曆左子樹

                 2) 訪問根結點

                 3) 中序遍曆右子樹

             3. 後序遍曆二叉樹的操作定義:

              若二叉樹為空白,則空操作;否則

                 1) 後序遍曆左子樹

                 2) 後序遍曆右子樹

                 3) 訪問根結點

   

     4. 層次遍曆二叉樹的操作定義:

              若二叉樹為空白,則空操作;否則

                 1) 從上到下

                 2) 同一層,從左至右依次遍曆

二叉樹的儲存結構:       1. 順序儲存結構:         

#define MAX_TREE_SIZE 100typedef char TElemType; typedef TElemType SqBiTree[MAX_TREE_SIZE];SqBiTree bt;

      2. 鏈式儲存結構:

//二叉樹的的#define MAXSIZE 100 //二叉樹中最多的結點數 typedef char TElemType; typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;

二叉樹的遍曆具體實現:

#include <stdio.h>#include <stdlib.h>//二叉樹的的#define MAXSIZE 100 //二叉樹中最多的結點數 typedef char TElemType; typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//定義函數指標typedef void(* Visit)(BiTree);//二叉樹的初始化void Init_BiTree(BiTree *T){*T = NULL;}//判斷二叉樹是否為空白,返回1int IsEmpty_BiTree(BiTree *T){return *T == NULL;}//建立二叉樹void Create_BiTree(BiTree *T){char ch;ch = getchar();//當輸入的是"#"時,認為該子樹為空白if(ch == '#')*T = NULL;//建立樹結點else{*T = (BiTree)malloc(sizeof(BiTNode));(*T)->data = ch; //產生樹結點//產生左子樹Create_BiTree(&(*T)->lchild);//產生右子樹Create_BiTree(&(*T)->rchild);}}//輸出結點的值void Print_BiTreeNode(BiTree T){printf("%c\t",T->data);}//先序遍曆二叉樹void PreOrder_BiTree(BiTree T,Visit visit){if(!IsEmpty_BiTree(&T)){visit(T);PreOrder_BiTree(T->lchild,visit);PreOrder_BiTree(T->rchild,visit);}}//中序遍曆二叉樹void InOrder_BiTree(BiTree T,Visit visit){if(!IsEmpty_BiTree(&T)){InOrder_BiTree(T->lchild,visit);visit(T);InOrder_BiTree(T->rchild,visit);}}//後序遍曆二叉樹 void PostOrder_BiTree(BiTree T,Visit visit){if(!IsEmpty_BiTree(&T)){PostOrder_BiTree(T->lchild,visit);PostOrder_BiTree(T->rchild,visit);visit(T);}}//層次遍曆二叉樹 void LevelOrder_BiTree(BiTree T,Visit visit){//用一個隊列儲存結點資訊,這裡的隊列採用的是順序隊列中的數組實現int front = 0;int rear = 0;BiTree BiQueue[MAXSIZE];BiTree tempNode;if(!IsEmpty_BiTree(&T)){//將根結點加入到隊列中 BiQueue[rear++] = T;while(front != rear){//取出隊頭元素,並使隊頭指標向後移動一位 tempNode = BiQueue[front++];//判斷左右子樹是否為空白,若為空白,則排入佇列 if(!IsEmpty_BiTree(&(tempNode->lchild)))BiQueue[rear++] = tempNode->lchild;if(!IsEmpty_BiTree(&(tempNode->rchild)))BiQueue[rear++] = tempNode->rchild;//輸出隊頭結點元素 //Vist_BiTreeNode(tempNode->data);visit(tempNode);}}}int main(){BiTree T;//將二叉樹初始為一個空的二叉樹Init_BiTree(&T);//建立二叉樹Create_BiTree(&T);//先序遍曆printf("\n先序遍曆結果:");PreOrder_BiTree(T,Print_BiTreeNode);//中序遍曆二叉樹printf("\n中序遍曆結果:");InOrder_BiTree(T,Print_BiTreeNode);//後序遍曆二叉樹 printf("\n後序遍曆結果:");PostOrder_BiTree(T,Print_BiTreeNode);//層次遍曆二叉樹 printf("\n層次遍曆結果:");LevelOrder_BiTree(T,Print_BiTreeNode);return 0;}

二叉樹的遍曆結果:

         給定二叉樹,如,輸入1247###5#8##36###




 

 

            




資料結構(C實現)------- 遍曆二叉樹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.