您的位置:首页 > 理论基础 > 数据结构算法

数据结构 算法面试100题 之 逐层遍历二叉树元素

2012-09-07 19:35 741 查看
其实就相当于图的宽度优先遍历。

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息