算法思想(重點是遞歸的使用)
利用擴展先序遍歷序列創建二叉鏈表
採用類似先序遍歷的遞歸算法,首先讀入當前根結點的數據,如果是'.'則將當前
樹根置爲空,否則申請一個新結點,存入當前根結點的數據,分別用當前根結點的
左子域和右子域進行遞歸調用,創建左、右子樹.
#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); //訪問根結點
}
}