其实就相当于图的宽度优先遍历。
#include "stdio.h"
#include "stddef.h"#include "stdlib.h"
#include "assert.h"
struct s_treeNode{
int value;
struct s_treeNode *lc;
struct s_treeNode *rc;
};
typedef struct s_treeNode t_treeNode;
struct s_queueNode{
struct s_queueNode *before;
t_treeNode *treeNode;
struct s_queueNode *next;
};
typedef struct s_queueNode t_queueNode;
struct s_queue{
t_queueNode *first;
t_queueNode *last;
};
typedef struct s_queue t_queue;
void enqueue(t_queue *queue, t_treeNode *treeNode){
t_queueNode *node = NULL;
assert(queue != NULL);
if(treeNode == NULL) return;
node = (t_queueNode *)malloc(sizeof(t_queueNode));
node->treeNode = treeNode;
node->before = queue->last;
node->next = NULL;
if(queue->last == NULL){
assert(queue->first == NULL);
queue->first = queue->last = node;
} else{
queue->last->next = node;
queue->last = node;
}
}
void dequeue(t_queue *queue){
t_queueNode *node = queue->first;
assert(queue != NULL);
assert(queue->first != NULL);
if(queue->first == queue->last){
queue->first = queue->last = NULL;
} else{
queue->first = node->next;
node->next->before = NULL;
}
free(node);
}
void print(t_treeNode *root){
t_queue queue;
t_queueNode *queueNode = (t_queueNode *)malloc(sizeof(t_queueNode));
t_queueNode *currQueueNode;
t_treeNode *currTreeNode;
if(root == NULL) return;
queueNode->before = NULL;
queueNode->treeNode = root;
queueNode->next = NULL;
queue.first = queueNode;
queue.last = queueNode;
while(queue.first != NULL){
//add lc and rc to queue
currQueueNode = queue.first;
currTreeNode = currQueueNode->treeNode;
enqueue(&queue, currTreeNode->lc);
enqueue(&queue, currTreeNode->rc);
//print curr node
printf("%d ", currTreeNode->value);
//delete curr node
dequeue(&queue);
}
}
t_treeNode* malloc_treeNode(int value){
t_treeNode *node = (t_treeNode *)malloc(sizeof(t_treeNode));
if(node != NULL){
node->value = value;
}
node->lc = NULL;
node->rc = NULL;
return node;
}
t_treeNode* buildTree(){
t_treeNode *root = malloc_treeNode(8);
t_treeNode *lc = malloc_treeNode(6);
t_treeNode *rc = malloc_treeNode(10);
root->lc = lc;
root->rc = rc;
lc->lc = malloc_treeNode(5);
lc->rc = malloc_treeNode(7);
rc->lc = malloc_treeNode(9);
rc->rc = malloc_treeNode(11);
return root;
}
void deleteTree(t_treeNode *root){
if(root == NULL) return;
if(root->lc != NULL) deleteTree(root->lc);
if(root->rc != NULL) deleteTree(root->rc);
free(root);
}
int main(){
t_treeNode *root = buildTree();
print(root);
deleteTree(root);
return 0;
}