老师的代码:
#include#include #define QUEUE_SIZE 5 typedef struct BTNode{ char element; BTNode* left; BTNode* right; }BTNode, *BTNodePtr; typedef struct BTNodePtrQueue{ BTNodePtr* nodePtrs; int front; int rear; }BTNodePtrQueue, *QueuePtr; QueuePtr initQueue(){ QueuePtr resultQueuePtr = (QueuePtr)malloc(sizeof(struct BTNodePtrQueue)); resultQueuePtr->nodePtrs = (BTNodePtr*)malloc(QUEUE_SIZE * sizeof(BTNodePtr)); resultQueuePtr->front = 0; resultQueuePtr->rear = 1; return resultQueuePtr; }//Of initQueue bool isQueueEmpty(QueuePtr paraQueuePtr){ if ((paraQueuePtr->front + 1) % QUEUE_SIZE == paraQueuePtr->rear) { return true; }//Of if return false; }//Of isQueueEmpty void enqueue(QueuePtr paraQueuePtr, BTNodePtr paraBTNodePtr){ printf("front = %d, rear = %d.rn", paraQueuePtr->front, paraQueuePtr->rear); if ((paraQueuePtr->rear + 1) % QUEUE_SIZE == paraQueuePtr->front % QUEUE_SIZE) { printf("Error, trying to enqueue %c. queue full.rn", paraBTNodePtr->element); return; }//Of if paraQueuePtr->nodePtrs[paraQueuePtr->rear] = paraBTNodePtr; paraQueuePtr->rear = (paraQueuePtr->rear + 1) % QUEUE_SIZE; printf("enqueue %c ends.rn", paraBTNodePtr->element); }//Of enqueue BTNodePtr dequeue(QueuePtr paraQueuePtr){ if (isQueueEmpty(paraQueuePtr)) { printf("Error, empty queuern"); return NULL; }//Of if paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE; //BTNodePtr tempPtr = paraQueuePtr->nodePtrs[paraQueuePtr->front + 1]; printf("dequeue %c ends.rn", paraQueuePtr->nodePtrs[paraQueuePtr->front]->element); return paraQueuePtr->nodePtrs[paraQueuePtr->front]; }//Of dequeue BTNodePtr constructBTNode(char paraChar){ BTNodePtr resultPtr = (BTNodePtr)malloc(sizeof(BTNode)); resultPtr->element = paraChar; resultPtr->left = NULL; resultPtr->right = NULL; return resultPtr; }//Of constructBTNode BTNodePtr stringToBTree(char* paraString){ int i; char ch; //Use a queue to manage the pointers QueuePtr tempQueuePtr = initQueue(); BTNodePtr resultHeader; BTNodePtr tempParent, tempLeftChild, tempRightChild; i = 0; ch = paraString[i]; resultHeader = constructBTNode(ch); enqueue(tempQueuePtr, resultHeader); while(!isQueueEmpty(tempQueuePtr)) { tempParent = dequeue(tempQueuePtr); //The left child i ++; ch = paraString[i]; if (ch == '#') { tempParent->left = NULL; } else { tempLeftChild = constructBTNode(ch); enqueue(tempQueuePtr, tempLeftChild); tempParent->left = tempLeftChild; }//Of if //The right child i ++; ch = paraString[i]; if (ch == '#') { tempParent->right = NULL; } else { tempRightChild = constructBTNode(ch); enqueue(tempQueuePtr, tempRightChild); tempParent->right = tempRightChild; }//Of if }//Of while return resultHeader; }//Of stringToBTree void levelwise(BTNodePtr paraTreePtr){ //Use a queue to manage the pointers char tempString[100]; int i = 0; QueuePtr tempQueuePtr = initQueue(); BTNodePtr tempNodePtr; enqueue(tempQueuePtr, paraTreePtr); while(!isQueueEmpty(tempQueuePtr)) { tempNodePtr = dequeue(tempQueuePtr); //For output. tempString[i] = tempNodePtr->element; i ++; if (tempNodePtr->left != NULL){ enqueue(tempQueuePtr, tempNodePtr->left); }//Of if if (tempNodePtr->right != NULL){ enqueue(tempQueuePtr, tempNodePtr->right); }//Of if }//Of while tempString[i] = ' '; printf("Levelwise: %srn", tempString); }//Of levelwise void preorder(BTNodePtr tempPtr){ if (tempPtr == NULL){ return; }//Of if printf("%c", tempPtr->element); preorder(tempPtr->left); preorder(tempPtr->right); }//Of preorder void inorder(BTNodePtr tempPtr){ if (tempPtr == NULL) { return; }//Of if inorder(tempPtr->left); printf("%c", tempPtr->element); inorder(tempPtr->right); }//Of inorder void postorder(BTNodePtr tempPtr){ if (tempPtr == NULL) { return; }//Of if postorder(tempPtr->left); postorder(tempPtr->right); printf("%c", tempPtr->element); }//Of postorder int main(){ BTNodePtr tempHeader; tempHeader = constructBTNode('c'); printf("There is only one node. Preorder visit: "); preorder(tempHeader); printf("rn"); char* tempString = "acde#bf######"; tempHeader = stringToBTree(tempString); printf("Preorder: "); preorder(tempHeader); printf("rn"); printf("Inorder: "); inorder(tempHeader); printf("rn"); printf("Postorder: "); postorder(tempHeader); printf("rn"); printf("Levelwise: "); levelwise(tempHeader); printf("rn"); return 1; }//Of main
我的代码:
#include#include #include #define QUEUE_SIZE 5//队列空间大小 typedef struct BTNode{ char element; struct BTNode* leftChild; struct BTNode* rightChild; }BTNode,*BTNodePtr; typedef struct BTNodeQueue{ BTNodePtr* nodePtrs; //队列里存放的是二叉树结点的地址 int front; int rear; }BTNodeQueue,*BTNodeQueuePtr; BTNodeQueuePtr initQueue(){ BTNodeQueuePtr QueuePtr=(BTNodeQueuePtr)malloc(sizeof(struct BTNodeQueue)); QueuePtr->nodePtrs=(BTNodePtr*)malloc(QUEUE_SIZE*sizeof(struct BTNode));//队列的空间用来存二叉树结点的地址 QueuePtr->front=0; QueuePtr->rear=1; return QueuePtr; } bool isQueueEmpty(BTNodeQueuePtr paraQueue){ if((paraQueue->front+1)%QUEUE_SIZE==paraQueue->rear){ return true; } return false; } void enqueue(BTNodeQueuePtr paraQueue,BTNodePtr paraBTNodePtr){ //判断队列是否已满 if((paraQueue->rear+1)%QUEUE_SIZE==paraQueue->front%QUEUE_SIZE){ printf("The queue is full.Cannot enqueue data %c.rn",paraBTNodePtr->element); } //结点指针入队 paraQueue->nodePtrs[paraQueue->rear]=paraBTNodePtr; paraQueue->rear=(paraQueue->rear+1)%QUEUE_SIZE; printf("%c has enqueued.rn",paraBTNodePtr->element); } BTNodePtr dequeue(BTNodeQueuePtr paraQueue){ //判断队列是否为空 if(paraQueue->front==paraQueue->rear){ printf("The queue is empty.Cannot dequeue element.rn"); return NULL; } //结点指针出队 paraQueue->front=(paraQueue->front+1)%QUEUE_SIZE;//front最初指向出队元素的前面的一个位置,现在让front指向出队指针 printf("dequeue %c ends.rn",paraQueue->nodePtrs[paraQueue->front]->element); return paraQueue->nodePtrs[paraQueue->front]; } BTNodePtr constructBTNode(char parachar){ BTNodePtr tempNode=(BTNodePtr)malloc(sizeof(struct BTNode)); tempNode->element=parachar; tempNode->leftChild=NULL; tempNode->rightChild=NULL; return tempNode; } BTNodePtr stringToBTree(char* paraString){ int i,ch; //初始化指针队列 BTNodeQueuePtr tempQueue=initQueue(); //头结点指针入队 BTNodePtr Header,tempParent,tempLeftChild,tempRightChild; i=0;ch=paraString[i];Header=constructBTNode(ch); enqueue(tempQueue,Header); //创建子树 while(!isQueueEmpty(tempQueue)){ tempParent=dequeue(tempQueue); //leftchild i++;ch=paraString[i]; if(ch=='#'){ tempParent->leftChild=NULL; }else{ tempLeftChild=constructBTNode(ch); enqueue(tempQueue,tempLeftChild); tempParent->leftChild=tempLeftChild; } //rightchild i++;ch=paraString[i]; if(ch=='#'){ tempParent->rightChild=NULL; }else{ tempRightChild=constructBTNode(ch); enqueue(tempQueue,tempRightChild); tempParent->rightChild=tempRightChild; } }//Of while return Header; } void levelwise(BTNodePtr paraTreePtr){ BTNodePtr tempNodePtr;//接受出队的结点指针 int i=0;char tempString[100];//将结点的字符依次保存在字符串中,方便输出 //初始化队列存储结点指针 BTNodeQueuePtr tempQueue=initQueue(); enqueue(tempQueue,paraTreePtr); while(!isQueueEmpty(tempQueue)){ tempNodePtr=dequeue(tempQueue); tempString[i]=tempNodePtr->element; i++; if(tempNodePtr->leftChild!=NULL){ enqueue(tempQueue,tempNodePtr->leftChild); } if(tempNodePtr->rightChild!=NULL){ enqueue(tempQueue,tempNodePtr->rightChild); } } tempString[i]==' '; printf("Levelwise:%srn",tempString); } void preOrder(BTNodePtr tempPtr){ if(tempPtr==NULL){ return; } printf("%c",tempPtr->element); preOrder(tempPtr->leftChild); preOrder(tempPtr->rightChild); } void inOrder(BTNodePtr tempPtr){ if(tempPtr==NULL){ return; } inOrder(tempPtr->leftChild); printf("%c",tempPtr->element); inOrder(tempPtr->rightChild); } void poOrder(BTNodePtr tempPtr){ if(tempPtr==NULL){ return; } poOrder(tempPtr->leftChild); poOrder(tempPtr->rightChild); printf("%c",tempPtr->element); } int main(){ BTNodePtr tempHeader;//保存根节点 //单个字符 tempHeader=constructBTNode('c'); printf("There is only one node.preOrder visit:rn"); preOrder(tempHeader); printf("rn"); //字符串 printf("---- the stringToBTree begins. ----rn"); char *tempString="acde#bf######"; tempHeader=stringToBTree(tempString); printf("---- the stringToBTree ends. ----rn"); printf("---- traversal begins, ----rn"); printf("preOrder:"); preOrder(tempHeader); printf("rn"); printf("inOrder:"); inOrder(tempHeader); printf("rn"); printf("poOrder:"); poOrder(tempHeader); printf("rn"); printf("Levelwise:rn"); levelwise(tempHeader); printf("---- traversal ends, ----rn"); return 0; }
运行结果:



