一、二叉树的概念以及结构
二叉树是n(n>=0)个节点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树组。
二、二叉树的遍历图解
先序遍历
中序遍历
后序遍历
层次遍历
三、代码部分
一、头文件
二、二叉树的结构
三、队列的结构
四、队列的初始化
五、判断队列是否为空
六、添加元素
七、删除元素
八、创建结点
九、创建二叉树
十、层次遍历
十一、主函数
十二、全部代码
十三、测试结果
一、头文件
#include #include #include #define MAXSIZE 5
二、二叉树的结构
//二叉树的结构 typedef struct BTnode{char element;struct BTnode *left;struct BTnode *right;}*BTnodePtr;
三、队列的结构
//队列typedef struct BTNodePtrQueue{BTnodePtr *nodePtrs;int front;int rear;}*QueuePtr;
四、队列的初始化
//初始化队列QueuePtr initQueue(){QueuePtr resultPtr = (QueuePtr)malloc(sizeof(struct BTNodePtrQueue));resultPtr->nodePtrs = (BTnodePtr*)malloc(MAXSIZE * (sizeof(BTnodePtr)));resultPtr->front = 0;resultPtr->rear = 1;return resultPtr;}
五、判断队列是否为空
int isQueueEmpty(QueuePtr paraQueuePtr){if ((paraQueuePtr->front + 1) % MAXSIZE == paraQueuePtr->rear) {return 1;}return 0;}
六、添加元素
//在队列中添加元素void enqueue(QueuePtr Queue,BTnodePtr newBTnodePtr){if((Queue->rear +1)%MAXSIZE == (Queue->front)%MAXSIZE ){printf("The queue is full.\n");return ; }Queue->nodePtrs [Queue->rear] = newBTnodePtr;Queue->rear = (Queue->rear+1)%MAXSIZE;printf("enqueue %c ends.\r\n", newBTnodePtr->element);}
七、删除元素
//删除元素BTnodePtr deQueue(QueuePtr Queue){if(isQueueEmpty(Queue)){printf("The queue is empty,can not delete.\n");return ;}Queue->front = (Queue->front +1)%MAXSIZE;printf("delete %c ends.\n",Queue->nodePtrs [Queue->front]->element);returnQueue->nodePtrs [Queue->front];}
八、创建结点
//创建结点 BTnodePtr constructBTnode(char newElement){BTnodePtr newPtr = (BTnodePtr)malloc(sizeof(struct BTnode));newPtr->element = newElement;newPtr->left = NULL;newPtr->right= NULL;return newPtr;}
九、创建二叉树
//创建二叉树BTnodePtr stringToBTree(char *newString){int i;char ch;i = 0;QueuePtr Queue = initQueue();BTnodePtr resultHeader;BTnodePtr tempParent,tempLeftChlid,tempRightChild;ch = newString[i];resultHeader = constructBTnode(ch);enqueue(Queue,resultHeader);while(!isQueueEmpty(Queue)){tempParent = deQueue(Queue);//左 i++;if(newString[i] == '#'){tempParent->left = NULL;}else{tempLeftChlid = constructBTnode(newString[i]);enqueue(Queue,tempLeftChlid);tempParent->left = tempLeftChlid;}//右i++;if(newString[i] == '#'){tempParent->right = NULL;}else{tempRightChild = constructBTnode(newString[i]);enqueue(Queue,tempRightChild);tempParent->right = tempRightChild;} } return resultHeader;}
十、层次遍历
//层次遍历void levelwise(BTnodePtr newTreePtr){char string[100];int i = 0;QueuePtr Queue = initQueue();BTnodePtr tempNodePtr;enqueue(Queue,newTreePtr);while(!isQueueEmpty(Queue)){tempNodePtr = deQueue(Queue);string[i] = tempNodePtr->element ;i++;if(tempNodePtr->left != NULL){enqueue(Queue,tempNodePtr->left);}if(tempNodePtr->right!= NULL){enqueue(Queue,tempNodePtr->right);}}string[i] = '\0';printf("levewise:%s",string);}
十一、主函数
int main(){BTnodePtr tempHeader;char* tempString = "acde#bf######";tempHeader = stringToBTree(tempString);printf("Levelwise: ");levelwise(tempHeader);printf("\r\n");return 1;}
十二、全部代码
include #include #include #define MAXSIZE 5//二叉树的结构 typedef struct BTnode{char element;struct BTnode *left;struct BTnode *right;}*BTnodePtr;//队列typedef struct BTNodePtrQueue{BTnodePtr *nodePtrs;int front;int rear;}*QueuePtr;//初始化队列QueuePtr initQueue(){QueuePtr resultPtr = (QueuePtr)malloc(sizeof(struct BTNodePtrQueue));resultPtr->nodePtrs = (BTnodePtr*)malloc(MAXSIZE * (sizeof(BTnodePtr)));resultPtr->front = 0;resultPtr->rear = 1;return resultPtr;} int isQueueEmpty(QueuePtr paraQueuePtr){if ((paraQueuePtr->front + 1) % MAXSIZE == paraQueuePtr->rear) {return 1;}return 0;}//在队列中添加元素void enqueue(QueuePtr Queue,BTnodePtr newBTnodePtr){if((Queue->rear +1)%MAXSIZE == (Queue->front)%MAXSIZE ){printf("The queue is full.\n");return ; }Queue->nodePtrs [Queue->rear] = newBTnodePtr;Queue->rear = (Queue->rear+1)%MAXSIZE;printf("enqueue %c ends.\r\n", newBTnodePtr->element);} //删除元素BTnodePtr deQueue(QueuePtr Queue){if(isQueueEmpty(Queue)){printf("The queue is empty,can not delete.\n");return ;}Queue->front = (Queue->front +1)%MAXSIZE;printf("delete %c ends.\n",Queue->nodePtrs [Queue->front]->element);returnQueue->nodePtrs [Queue->front];} //创建结点 BTnodePtr constructBTnode(char newElement){BTnodePtr newPtr = (BTnodePtr)malloc(sizeof(struct BTnode));newPtr->element = newElement;newPtr->left = NULL;newPtr->right= NULL;return newPtr;}//创建二叉树BTnodePtr stringToBTree(char *newString){int i;char ch;i = 0;QueuePtr Queue = initQueue();BTnodePtr resultHeader;BTnodePtr tempParent,tempLeftChlid,tempRightChild;ch = newString[i];resultHeader = constructBTnode(ch);enqueue(Queue,resultHeader);while(!isQueueEmpty(Queue)){tempParent = deQueue(Queue);//左 i++;if(newString[i] == '#'){tempParent->left = NULL;}else{tempLeftChlid = constructBTnode(newString[i]);enqueue(Queue,tempLeftChlid);tempParent->left = tempLeftChlid;}//右i++;if(newString[i] == '#'){tempParent->right = NULL;}else{tempRightChild = constructBTnode(newString[i]);enqueue(Queue,tempRightChild);tempParent->right = tempRightChild;} } return resultHeader;}//层次遍历void levelwise(BTnodePtr newTreePtr){char string[100];int i = 0;QueuePtr Queue = initQueue();BTnodePtr tempNodePtr;enqueue(Queue,newTreePtr);while(!isQueueEmpty(Queue)){tempNodePtr = deQueue(Queue);string[i] = tempNodePtr->element ;i++;if(tempNodePtr->left != NULL){enqueue(Queue,tempNodePtr->left);}if(tempNodePtr->right!= NULL){enqueue(Queue,tempNodePtr->right);}}string[i] = '\0';printf("levewise:%s",string);} int main(){BTnodePtr tempHeader;char* tempString = "acde#bf######";tempHeader = stringToBTree(tempString);printf("Levelwise: ");levelwise(tempHeader);printf("\r\n");return 1;}
十三、测试结果