在计算机科学中,树(tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
每个节点有零个或多个子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树;
二叉树计算机语言中多用二叉树是因为计算机是二进制,0和1刚好符合二叉树的形式
二叉树的遍历法则 先序遍历
即先访问根结点,再先序遍历左子树,最后先序遍历右子树。(根、左、右)
上图遍历结果:ABDCEF
中序遍历即先中序遍历左子树,再访问根结点,最后再中序遍历右子树。(左、根、右)
上图遍历结果:DBAECF
后序遍历即先后序遍历左子树,再去后序遍历右子树,最后访问根结点。(左、右、根)
上图遍历结果:DBEFCA
层序遍历即从上往下,从左到右依次访问二叉树中的每一个结点,一层一层地进行遍历。
上图遍历结果:ABCDEF
总代码#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; }//队列初始化 bool isQueueEmpty(QueuePtr paraQueuePtr){ if ((paraQueuePtr->front + 1) % QUEUE_SIZE == paraQueuePtr->rear) { return true; } return false; }//判断队列是否为空 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; } paraQueuePtr->nodePtrs[paraQueuePtr->rear] = paraBTNodePtr; paraQueuePtr->rear = (paraQueuePtr->rear + 1) % QUEUE_SIZE; printf("enqueue %c ends.rn", paraBTNodePtr->element); } BTNodePtr dequeue(QueuePtr paraQueuePtr){ if (isQueueEmpty(paraQueuePtr)) { printf("Error, empty queuern"); return NULL; } 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]; } BTNodePtr constructBTNode(char paraChar){ BTNodePtr resultPtr = (BTNodePtr)malloc(sizeof(BTNode)); resultPtr->element = paraChar; resultPtr->left = NULL; resultPtr->right = NULL; return resultPtr; } 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); //左儿子 i ++; ch = paraString[i]; if (ch == '#') { tempParent->left = NULL; } else { tempLeftChild = constructBTNode(ch); enqueue(tempQueuePtr, tempLeftChild); tempParent->left = tempLeftChild; } //右儿子 i ++; ch = paraString[i]; if (ch == '#') { tempParent->right = NULL; } else { tempRightChild = constructBTNode(ch); enqueue(tempQueuePtr, tempRightChild); tempParent->right = tempRightChild; } } return resultHeader; } 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); } if (tempNodePtr->right != NULL){ enqueue(tempQueuePtr, tempNodePtr->right); } } tempString[i] = ' '; printf("Levelwise: %srn", tempString); } //前序 void preorder(BTNodePtr tempPtr){ if (tempPtr == NULL){ return; } printf("%c", tempPtr->element); preorder(tempPtr->left); preorder(tempPtr->right); } //中序 void inorder(BTNodePtr tempPtr){ if (tempPtr == NULL) { return; } inorder(tempPtr->left); printf("%c", tempPtr->element); inorder(tempPtr->right); } //后序 void postorder(BTNodePtr tempPtr){ if (tempPtr == NULL) { return; } postorder(tempPtr->left); postorder(tempPtr->right); printf("%c", tempPtr->element); } 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; }



