數據結構 算法面試100題 之 逐層遍歷二叉樹元素

其實就相當於圖的寬度優先遍歷。


#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章