C語言實現二叉樹的建立&遍歷
阿新 • • 發佈:2018-12-22
演算法思想(重點是遞迴的使用)
利用擴充套件先序遍歷序列建立二叉連結串列
採用類似先序遍歷的遞迴演算法,首先讀入當前根結點的資料,如果是'.'則將當前
樹根置為空,否則申請一個新結點,存入當前根結點的資料,分別用當前根結點的
左子域和右子域進行遞迴呼叫,建立左、右子樹.
#include <stdio.h> #include <stdlib.h> typedef char DataType; //二叉連結串列結點的資料型別 typedef struct Node //定義二叉樹的二叉連結串列結點結構 { DataType data; struct Node *LChild; //左子樹 struct Node *RChild; //右子樹 }BiTNode,*BiTree; void CreateBiTree(BiTree *bt); //建立二叉連結串列函式 void PreOrder(BiTree root); //先序遍歷二叉樹 void InOrder(BiTree root); //中序遍歷二叉樹 void PostOrder(BiTree root); //後序遍歷二叉樹 int main() { BiTree bt; int choice; while(true) { //二叉樹操作選擇選單 printf("*****************Please enter your choice*****************\n\n"); printf(" choice 1:建立二叉樹\n"); printf(" choice 2:先序遍歷二叉樹\n"); printf(" choice 3:中序遍歷二叉樹\n"); printf(" choice 4:後序遍歷二叉樹\n"); printf(" choice 0:退出\n\n"); scanf("%d",&choice); switch(choice) { case 1: CreateBiTree(&bt); break; case 2: PreOrder(bt); printf("\n"); break; case 3: InOrder(bt); printf("\n"); break; case 4: PostOrder(bt); printf("\n"); break; case 0: exit(0); break; default: printf("ERROR!!\n"); exit(0); break; } } return 0; } void CreateBiTree(BiTree *bt) { char ch; printf("Please enter data:"); getchar(); ch = getchar(); if(ch == '.') //讀入的資料是'.'則將當前樹根置為空 { *bt = NULL; } else //讀入正常資料,為當前樹根分配地址空間 { *bt = (BiTree)malloc(sizeof(BiTNode)); (*bt)->data = ch; CreateBiTree(&((*bt)->LChild)); //遞迴呼叫CreateBiTree()函式,處理左子樹 CreateBiTree(&((*bt)->RChild)); //遞迴呼叫CreateBiTree()函式,處理右子樹 } } void PreOrder(BiTree root) //先序遍歷二叉樹,root為指向二叉樹根結點的指標 { if(root!=NULL) { printf("%c ",root->data); //訪問根結點 PreOrder(root->LChild); //先序遍歷左子樹 PreOrder(root->RChild); //先序遍歷右子樹 } } void InOrder(BiTree root) //中序遍歷二叉樹,root為指向二叉樹根結點的指標 { if(root!=NULL) { InOrder(root->LChild); //中序遍歷左子樹 printf("%c ",root->data); //訪問根結點 InOrder(root->RChild); //中序遍歷右子樹 } } void PostOrder(BiTree root) //中序遍歷二叉樹,root為指向二叉樹根結點的指標 { if(root!=NULL) { PostOrder(root->LChild); //後序遍歷左子樹 PostOrder(root->RChild); //後序遍歷右子樹 printf("%c ",root->data); //訪問根結點 } }