数据结构 算法面试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;
}
#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;
}
相关文章推荐
- 数据结构与算法6:二叉树的存储结构与遍历
- 【算法学习笔记】10.数据结构基础 二叉树初步练习3(遍历与递归复习)
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 【算法学习笔记】10.数据结构基础 二叉树初步练习3(遍历与递归复习)
- 数据结构与算法简记:按层次顺序遍历和存储二叉树
- 算法与数据结构基础4:C++二叉树实现及遍历方法大全
- 【数据结构与算法】二叉树的遍历
- 【数据结构与算法】二叉树的遍历
- 【数据结构与算法】二叉树广度遍历
- 数据结构与算法 -- 二叉树链式详解((非)/递归遍历,叶子个数,深度计算)
- 【数据结构与算法】二叉树前序、中序、后序遍历间关系
- 数据结构与算法——二叉树的前序遍历,中序遍历,后序遍历
- 【数据结构与算法】二叉树广度遍历
- 微软等数据结构+算法面试100题(41)-- 二叉树的前序遍历
- 【数据结构与算法】二叉树的层序遍历
- 【数据结构与算法】二叉树 遍历
- 【数据结构与算法】二叉树的层序遍历
- 【数据结构与算法】二叉树的层序遍历
- 【数据结构与算法】(六) c 语言实现简单的二叉树静态创建及先序、中序、后序遍历
- 【数据结构与算法】根据遍历结果构建二叉树