您的位置:首页 > 其它

(微软100题)把二元查找树转变成排序的双向链表

2013-01-23 20:26 429 查看

问题描述:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。

如:
10
6 12
4 8 14 16
转换成排序的双向链表为:4, 6, 8, 10, 12, 14, 16

思路:

中序遍历二元查找树即可得到排序的序列,将这个序列加入到双向链表中即可。
可以直即使用二叉树中的节点作为链表的节点,左指针指向前一个节点, 右指针指向后一个节点。

代码示例:

//
#include "stdafx.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _node_t{
_node_t *left;
_node_t *right;
int val;
}node_t;

// double linked list
node_t *link_head = NULL;
node_t *link_index = NULL;

// tree
node_t *root_node = NULL;

int tree_add_node(node_t **pp_root, int val)
{
node_t *p = *pp_root;
if (p == NULL){
p = (node_t *)malloc(sizeof(node_t));
*pp_root = p;
p->val = val;
p->left = NULL;
p->right = NULL;
return 0;
}
if (val < p->val){
tree_add_node(&p->left, val);
}
else{
tree_add_node(&p->right, val);
}
return 0;
}

void delete_tree(node_t *p_root)
{
if (p_root->left != NULL){
delete_tree(p_root->left);
}
else if (p_root->right != NULL){
delete_tree(p_root->right);
}
else{
free(p_root);
p_root = NULL;
return ;
}
}

int link_add_node(node_t *p)
{
if (p == NULL){
return -1;
}
if (link_head == NULL){
link_head = p;
link_index = link_head;
}
else{
p->left = link_index;
link_index->right = p;
link_index = p;
}
return 0;
}

int gen_link_list(node_t *p)
{
if (p == NULL){
return 0;
}
gen_link_list(p->left);
link_add_node(p);
gen_link_list(p->right);
return 0;
}

void print_list(node_t *p)
{
while (p != NULL)
{
printf("%d->", p->val);
p = p->right;
}
printf("\b\b  \n");
}

int main()
{
tree_add_node(&root_node, 10);
tree_add_node(&root_node, 6);
tree_add_node(&root_node, 4);
tree_add_node(&root_node, 8);
tree_add_node(&root_node, 14);
tree_add_node(&root_node, 12);
tree_add_node(&root_node, 16);
gen_link_list(root_node);
print_list(link_head);
delete_tree(root_node);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐