/* 李飞龙: 这是二叉树算法的源代码,只是一个范例,你们要先看明白然后再结合实验具体要求来修改。 请转发给其它同学,明天上机和13周星期二就要做这个实验。 白伟华 二叉树实现源代码如下: */ #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 typedef int status; typedef struct BiNode { char Data; struct BiNode* lChild; struct BiNode* rChild; }BiNode,*pBiNode; status CreateTree(BiNode** pTree); status PreOrderTraval(BiNode* pTree); status Visit(char Data); status Display(BiNode* pTree,int Level); status Clear(BiNode* pTree); BiNode *pRoot=NULL; main() { clrscr(); CreateTree(&pRoot); printf("\nPreOrder:"); PreOrderTraval(pRoot); printf("\n"); printf("\nInOrder:"); InOrderTraval(pRoot); printf("\n"); printf("\nPostOrder:"); PostOrderTraval(pRoot); printf("\n"); printf("\nShowLeaves:"); ShowLeaves(pRoot); printf("\n-----------------------\n"); printf("\n"); Display(pRoot,0); printf("\n"); printf("\nDeleting Tree:\n"); DelTree(pRoot); printf("BiTree Deleted."); getch(); } status CreateTree(BiNode** pTree) /*Input Example: abd##e##cf##g##*/ { char ch; scanf("%c",&ch); if(ch==‘#‘) { (*pTree)=NULL; } else { if(!((*pTree)=(BiNode*)malloc(sizeof(BiNode)))) { exit(OVERFLOW); } (*pTree)->Data=ch; CreateTree(&((*pTree)->lChild)); CreateTree(&((*pTree)->rChild)); } return OK; } status PreOrderTraval(BiNode* pTree) { if(pTree) { if(Visit(pTree->Data)) { if(PreOrderTraval(pTree->lChild)) { if(PreOrderTraval(pTree->rChild)) { return OK; } } } return ERROR; } else { return OK; } } status InOrderTraval(BiNode* pTree) { if(pTree) { if(InOrderTraval(pTree->lChild)) { if(Visit(pTree->Data)) { if(InOrderTraval(pTree->rChild)) { return OK; } } return ERROR; } return ERROR; } else { return OK; } } status PostOrderTraval(BiNode* pTree) { if(pTree) { if(PostOrderTraval(pTree->lChild)) { if(PostOrderTraval(pTree->rChild)) { if(Visit(pTree->Data)) { return OK; } return ERROR; } } return ERROR; } else { return OK; } } status Visit(char Data) { printf("%c",Data); return OK; } status Display(BiNode* pTree,int Level) { int i; if(pTree==NULL) return; Display(pTree->lChild,Level+1); for(i=0;i=1) { printf("--"); } printf("%c\n",pTree->Data); Display(pTree->rChild,Level+1); } status ShowLeaves(BiNode* pTree) { if(pTree) { if(ShowLeaves(pTree->lChild)) { if(ShowLeaves(pTree->rChild)) { if((pTree->lChild==NULL)&&(pTree->rChild==NULL)) { if(!Visit(pTree->Data)) { return ERROR; } } return OK; } } return ERROR; } else { return OK; } } status DelTree(BiNode* pTree) { if(pTree) { if(DelTree(pTree->lChild)) { if(DelTree(pTree->rChild)) { printf("Deleting %c\n",pTree->Data); free((void*)pTree); return OK; } } return ERROR; } else { return OK; } }