標籤:二叉樹的遍曆 二叉樹 遍曆
本文是自己學習所做筆記,歡迎轉載,但請註明出處: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實現)------- 遍曆二叉樹