数据结构 算法面试100题 之 二叉树转换成双向链表
2012-09-11 16:16
531 查看
本质上是对二叉树进行中序遍历。二叉树节点和链表节点使用同一个struct,只改变指针指向。
#include "stdio.h"
#include "stddef.h"
#include "stdlib.h"
#include "assert.h"
struct s_node{
int value;
struct s_node *lNode;
struct s_node *rNode;
};
typedef struct s_node t_node;
struct s_list{
t_node *first;
t_node *last;
};
typedef struct s_list t_list;
void addToList(t_list *list, t_node *node){
assert(list != NULL && node != NULL);
if(list->last == NULL){
//no node in the list
assert(list->first == NULL);
node->lNode = NULL;
list->first = list->last = node;
} else{
list->last->rNode = node;
node->lNode = list->last;
list->last = node;
}
}
t_node* mallocNode(int value){
t_node *node = (t_node *)malloc(sizeof(t_node));
if(node != NULL){
node->value = value;
}
node->lNode = NULL;
node->rNode = NULL;
return node;
}
t_node* buildTree(){
t_node *root = mallocNode(8);
t_node *lNode = mallocNode(6);
t_node *rNode = mallocNode(10);
root->lNode = lNode;
root->rNode = rNode;
lNode->lNode = mallocNode(5);
lNode->rNode = mallocNode(7);
rNode->lNode = mallocNode(9);
rNode->rNode = mallocNode(11);
return root;
}
void deleteTree(t_node *root){
if(root == NULL) return;
if(root->lNode != NULL) deleteTree(root->lNode);
if(root->rNode != NULL) deleteTree(root->rNode);
free(root);
}
void TreeToList(t_node *root, t_list *list){
if(root == NULL) return;
if(root->lNode) TreeToList(root->lNode, list);
addToList(list, root);
if(root->rNode) TreeToList(root->rNode, list);
}
void printList(t_list *list){
t_node *currNode = list->first;
if(list == NULL || list->first == NULL || list->last == NULL) return;
while(currNode != NULL){
printf("%d ", currNode->value);
currNode = currNode->rNode;
}
printf("\n");
}
int main(){
t_node *root = buildTree();
t_list list;
list.first = list.last = NULL;
TreeToList(root, &list);
printList(&list);
deleteTree(root);
return 0;
}
#include "stdio.h"
#include "stddef.h"
#include "stdlib.h"
#include "assert.h"
struct s_node{
int value;
struct s_node *lNode;
struct s_node *rNode;
};
typedef struct s_node t_node;
struct s_list{
t_node *first;
t_node *last;
};
typedef struct s_list t_list;
void addToList(t_list *list, t_node *node){
assert(list != NULL && node != NULL);
if(list->last == NULL){
//no node in the list
assert(list->first == NULL);
node->lNode = NULL;
list->first = list->last = node;
} else{
list->last->rNode = node;
node->lNode = list->last;
list->last = node;
}
}
t_node* mallocNode(int value){
t_node *node = (t_node *)malloc(sizeof(t_node));
if(node != NULL){
node->value = value;
}
node->lNode = NULL;
node->rNode = NULL;
return node;
}
t_node* buildTree(){
t_node *root = mallocNode(8);
t_node *lNode = mallocNode(6);
t_node *rNode = mallocNode(10);
root->lNode = lNode;
root->rNode = rNode;
lNode->lNode = mallocNode(5);
lNode->rNode = mallocNode(7);
rNode->lNode = mallocNode(9);
rNode->rNode = mallocNode(11);
return root;
}
void deleteTree(t_node *root){
if(root == NULL) return;
if(root->lNode != NULL) deleteTree(root->lNode);
if(root->rNode != NULL) deleteTree(root->rNode);
free(root);
}
void TreeToList(t_node *root, t_list *list){
if(root == NULL) return;
if(root->lNode) TreeToList(root->lNode, list);
addToList(list, root);
if(root->rNode) TreeToList(root->rNode, list);
}
void printList(t_list *list){
t_node *currNode = list->first;
if(list == NULL || list->first == NULL || list->last == NULL) return;
while(currNode != NULL){
printf("%d ", currNode->value);
currNode = currNode->rNode;
}
printf("\n");
}
int main(){
t_node *root = buildTree();
t_list list;
list.first = list.last = NULL;
TreeToList(root, &list);
printList(&list);
deleteTree(root);
return 0;
}
相关文章推荐
- 面试100题系列之1将查找二叉树转换成有序的双向链表
- 链表节点面试100题系列之1将查找二叉树转换成有序的双向链表
- 微软等数据结构+算法面试100题(43)-- 把二元查找树转变成排序的双向链表
- 微软等数据结构+算法面试100题(21)--二叉树打印到叶子节点的所有路径
- 微软等数据结构+算法面试100题(5)--怎样编写一个程序,把一个有序整数数组放到二叉树中
- 数据结构 将搜索二叉树转换成双向链表
- 算法面试100题——1、把二元查找树转变成排序的双向链表
- 算法题——二叉树转换为双向链表
- 把二元查找树转变成排序的双向链表——精选微软经典的算法面试100题中第一题
- (算法)二叉树转换为双向链表
- 微软等数据结构+算法面试100题(31)--在O(1)时间内删除链表结点
- 微软等数据结构+算法面试100题(32)--从尾到头输出链表
- 微软等数据结构+算法面试100题(3)--怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?
- 数据结构:题目(1)二叉树转换为双向链表
- 微软等数据结构+算法面试100题(35)-- 二叉树的深度
- 微软等面试100题筛选答案-1-二元查找树转换成一个排序的双向链表
- 微软等数据结构+算法面试100题(36)-- 打印二叉树中某一层的节点
- 微软等数据结构+算法面试100题(41)-- 二叉树的前序遍历
- 微软等数据结构+算法面试100题(4)--怎样从顶部开始逐层打印二叉树结点数据?请编程
- 微软等数据结构+算法面试100题(19)--链表