資料結構與演算法·實驗九
阿新 • • 發佈:2019-01-29
求二叉樹的層序遍歷問題
要求:(1)編寫一個建立二叉樹的函式。
(2)編寫按層次(同一層自左至右)輸出二叉樹中所有的結點的函式。
(3)編寫一個測試主函式。
#include<stdlib.h> #include<stdio.h> typedef char ElemType; #include "BiTree.h" typedef BiTreeNode *DataType; #include "LinQueue.h" void visit(DataType item) { printf("%c",item); } //void LayerOrder(BiTreeNode *T) //{ //} void main(void) { BiTreeNode *root,*p,*pp; int count; Initiate(&root); p=InsertleftNode(root,'A'); p=InsertleftNode(p,'B'); p=InsertleftNode(p,'D'); p=InsertRightNode(p,'G'); p=InsertRightNode(root->leftChild,'C'); pp=p; InsertleftNode(p,'E'); InsertRightNode(pp,'F'); //LayerOrder(root->leftChild); Destroy(&root); }
typedef struct Node { ElemType data; /*資料域*/ struct Node *leftChild; /*左子樹指標*/ struct Node *rightChild; /*右子樹指標*/ }BiTreeNode; /*結點的結構體定義*/ void Initiate(BiTreeNode **root) /*初始化建立二叉樹的頭結點*/ { *root=(BiTreeNode *)malloc(sizeof(BiTreeNode)); (*root)->leftChild=NULL; (*root)->rightChild=NULL; } void Destroy(BiTreeNode **root) { if((*root)!=NULL&&(*root)->leftChild!=NULL) Destroy(&(*root)->leftChild); if((*root)!=NULL&&(*root)->rightChild!=NULL) Destroy(&(*root)->rightChild); free(*root); } /*若當前結點curr非空,在curr的左子樹插入元素值為x的新結點*/ /*原curr所指結點的左子樹成為新插入結點的左子樹*/ /*若插入成功返回新插入結點的指標,否則返回空指標*/ BiTreeNode *InsertleftNode(BiTreeNode *curr,ElemType x) { BiTreeNode *s,*t; if(curr==NULL) return NULL; t=curr->leftChild; s=(BiTreeNode *)malloc(sizeof(BiTreeNode)); s->data=x; s->leftChild=t; s->rightChild=NULL; curr->leftChild=s; return curr->leftChild; } BiTreeNode *InsertRightNode(BiTreeNode *curr,ElemType x) { BiTreeNode *s,*t; if(curr==NULL) return NULL; t=curr->rightChild; /*儲存原curr所指結點的右子樹指標*/ s=(BiTreeNode *)malloc(sizeof(BiTreeNode)); s->data=x; s->rightChild=t; /*新插入結點的右子樹為原curr的右子樹*/ s->leftChild=NULL; curr->rightChild=s; /*新結點成為curr的右子樹*/ return curr->rightChild; /*返回新插入結點的指標*/ } BiTreeNode *DeleteLeftTree(BiTreeNode *curr) /*若curr非空,刪除curr所指結點的左子樹*/ { if(curr==NULL||curr->leftChild==NULL) return NULL; Destroy(&curr->leftChild); curr->leftChild=NULL; return curr; /*若刪除成功返回刪除結點的雙親結點指標,否則返回空指標*/ } BiTreeNode *DeleteRightTree(BiTreeNode *curr) { if(curr==NULL||curr->rightChild==NULL) return NULL; Destroy(&curr->rightChild); curr->rightChild=NULL; return curr; }
typedef struct qnode { DataType data; struct qnode *next; }LQNode; typedef struct { LQNode *front; /*隊頭指標*/ LQNode *rear; /*隊尾指標*/ }LQueue; void QueueInitiate(LQueue *Q) /*初始化鏈式佇列Q*/ { Q->rear=NULL; /*定義初始隊尾指標下標值*/ Q->front=NULL; /*定義初始隊頭指標下標值*/ } int QueueNotEmpty(LQueue Q) /*判鏈式佇列Q非空否,非空則返回1,否則返回0*/ { if(Q.front==NULL) return 0; else return 1; } int QueueAppend(LQueue *Q,DataType x) /*把資料元素值x插入鏈式佇列Q的隊尾,入佇列成功則返回1,否則返回0 */ { LQNode *p; if((p=(LQNode *)malloc(sizeof(LQNode)))==NULL) { printf("記憶體空間不足!"); return 0; } p->data=x; p->next=NULL; if(Q->rear!=NULL) Q->rear->next=p; Q->rear=p; if(Q->front==NULL) Q->front=p; return 1; } int QueueDelete(LQueue *Q,DataType *d) /*刪除鏈式佇列Q的隊頭資料元素值到d ,出佇列成功則返回1,否則返回0*/ { LQNode *p; if(Q->front==NULL) { printf("佇列已空無資料元素出佇列!\n"); return 0; } else { *d=Q->front->data; p=Q->front; Q->front=Q->front->next; if(Q->front==NULL) Q->rear=NULL; free(p); return 1; } } int QueueGet(LQueue Q,DataType *d) /*取鏈式佇列Q的當前隊頭資料元素值到d ,成功則返回1,否則返回0*/ { if(Q.front==NULL) { printf("佇列已空無資料元素出佇列!\n"); return 0; } else { *d=Q.front->data; return 1; } } void Destroy1(LQueue Q) { LQNode *p,*p1; p=Q.front; while(p!=NULL) { p1=p; p=p->next; free(p1); } }