- 一、二叉树的创建及遍历
- (1)初始化队列
- (2)入队、出队
- (3)二叉树的遍历
- 二、全部代码
- (1)代码如下
- (2) 运行结果
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;
}
(2)入队、出队
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("队满!rn");
return;
}
paraQueuePtr->nodePtrs[paraQueuePtr->rear] = paraBTNodePtr;
paraQueuePtr->rear = (paraQueuePtr->rear + 1) % QUEUE_SIZE;
printf("%c入队.rn", paraBTNodePtr->element);
}
BTNodePtr dequeue(QueuePtr paraQueuePtr){
if (isQueueEmpty(paraQueuePtr)) {
printf("队空!rn");
return NULL;
}
paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE;
//BTNodePtr tempPtr = paraQueuePtr->nodePtrs[paraQueuePtr->front + 1];
printf("%c出队.rn", paraQueuePtr->nodePtrs[paraQueuePtr->front]->element);
return paraQueuePtr->nodePtrs[paraQueuePtr->front];
}
(3)二叉树的遍历
以下面的二叉树为例:
二叉树的的遍历有四种方式:前序遍历、中序遍历、后序遍历和层序遍历
1、前序遍历:先访问根节点,再分别前序遍历左、右两颗子树。前序遍历结果为:acbedf
void preorder(BTNodePtr tempPtr){
if (!tempPtr){
return;
}
printf("%c", tempPtr->element);
preorder(tempPtr->lChild);
preorder(tempPtr->rChild);
}
2、中序遍历:先中序遍历左子树,然后访问根节点,最后中序遍历右子树。中序遍历结果为:cbaedf
void inorder(BTNodePtr tempPtr){
if (!tempPtr){
return;
}
inorder(tempPtr->lChild);
printf("%c", tempPtr->element);
inorder(tempPtr->rChild);
}
3、后序遍历:先后序遍历左子树,再后序遍历右子树,最后访问根节点。后序遍历结果为:bcdfea
void postorder(BTNodePtr tempPtr){
if (!tempPtr){
return;
}
postorder(tempPtr->lChild);
postorder(tempPtr->rChild);
printf("%c", tempPtr->element);
}
4、层序遍历:根节点开始,逐层访问各子节点。层序遍历结果为:acebdf
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->lChild != NULL){
enqueue(tempQueuePtr, tempNodePtr->lChild);
}
if (tempNodePtr->rChild != NULL){
enqueue(tempQueuePtr, tempNodePtr->rChild);
}
}
tempString[i] = ' ';
printf("Levelwise: %srn", tempString);
}
二、全部代码
(1)代码如下
#include(2) 运行结果#include #define QUEUE_SIZE 5 #define true 1 #define false 0 //binary tree node. typedef struct BTNode{ char element; BTNode* lChild; BTNode* rChild; }BTNode,*BTNodePtr; //A queue with a number of pointers typedef struct BTNodePtrQueue{ BTNodePtr* nodePtrs; int front; int rear; }BTNodePtrQueue,*QueuePtr; //Initialize the queue.(初始化) 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; } //Is the queue empty? 判断队是否为空 bool isQueueEmpty(QueuePtr paraQueuePtr){ if((paraQueuePtr->front + 1)%QUEUE_SIZE == paraQueuePtr->rear){//判断队列是否为空的条件 return true; } else{ return false; } } // Add a pointer to the queue. 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("队满!rn"); return; } paraQueuePtr->nodePtrs[paraQueuePtr->rear] = paraBTNodePtr; paraQueuePtr->rear = (paraQueuePtr->rear + 1) % QUEUE_SIZE; printf("%c入队.rn", paraBTNodePtr->element); } // Remove an element from the queue and return. BTNodePtr dequeue(QueuePtr paraQueuePtr){ if (isQueueEmpty(paraQueuePtr)) { printf("队空!rn"); return NULL; } paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE; //BTNodePtr tempPtr = paraQueuePtr->nodePtrs[paraQueuePtr->front + 1]; printf("%c出队.rn", paraQueuePtr->nodePtrs[paraQueuePtr->front]->element); return paraQueuePtr->nodePtrs[paraQueuePtr->front]; } // Construct a BTNode using the given char. BTNodePtr constructBTNode(char paraChar){ BTNodePtr resultPtr = (BTNodePtr)malloc(sizeof(BTNode)); resultPtr->element = paraChar; resultPtr->lChild = NULL; resultPtr->rChild = NULL; return resultPtr; } // Construct a binary tree using the given string. BTNodePtr stringToBTree(char* paraString){ int i; char ch; //用队管理指针 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->lChild = NULL; } else { tempLeftChild = constructBTNode(ch); enqueue(tempQueuePtr, tempLeftChild); tempParent->lChild = tempLeftChild; } //The right child i ++; ch = paraString[i]; if (ch == '#'){ tempParent->rChild = NULL; } else { tempRightChild = constructBTNode(ch); enqueue(tempQueuePtr, tempRightChild); tempParent->rChild = tempRightChild; } } return resultHeader; } // Levelwise.(层序遍历) void levelwise(BTNodePtr paraTreePtr){ //用队列存储指针 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->lChild != NULL){ enqueue(tempQueuePtr, tempNodePtr->lChild); } if (tempNodePtr->rChild != NULL){ enqueue(tempQueuePtr, tempNodePtr->rChild); } } tempString[i] = ' '; printf("Levelwise: %srn", tempString); } // Preorder.(前序遍历) void preorder(BTNodePtr tempPtr){ if (!tempPtr){ return; } printf("%c", tempPtr->element); preorder(tempPtr->lChild); preorder(tempPtr->rChild); } // Inorder.(中序遍历) void inorder(BTNodePtr tempPtr){ if (!tempPtr){ return; } inorder(tempPtr->lChild); printf("%c", tempPtr->element); inorder(tempPtr->rChild); } // Postorder.(后序遍历) void postorder(BTNodePtr tempPtr){ if (!tempPtr){ return; } postorder(tempPtr->lChild); postorder(tempPtr->rChild); printf("%c", tempPtr->element); } // The entrance. int main(){ BTNodePtr tempHeader; char* tempString = "aceb#df######"; 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 true; }
front = 0, rear = 1. a入队. a出队. front = 1, rear = 2. c入队. front = 1, rear = 3. e入队. c出队. front = 2, rear = 4. b入队. e出队. front = 3, rear = 0. d入队. front = 3, rear = 1. f入队. b出队. d出队. f出队. Preorder: acbedf Inorder: bcadef Postorder: bcdfea Levelwise: front = 0, rear = 1. a入队. a出队. front = 1, rear = 2. c入队. front = 1, rear = 3. e入队. c出队. front = 2, rear = 4. b入队. e出队. front = 3, rear = 0. d入队. front = 3, rear = 1. f入队. b出队. d出队. f出队. Levelwise: acebdf



