`
mmdev
  • 浏览: 12891682 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

二叉查找树转化成链表的具体实现

 
阅读更多
今天看到一个有趣的算法,然后自己动手写来了一下。要求把二叉查找树BineraySortTree转化成链表List,并且在这过程中不是用辅助的存储空间,只是变化一下指针。
熄灯后写了差不多1个小时,总是有段错误。。。查找半天才发现吧是没有给指针初始化,桑不起啊。。。。。OK,下面是详细的代码,测试过,可以运行。
#include<stdio.h>
#include<stdlib.h>


/****************************************************
*define the node structure
****************************************************/
struct BSTreeNode
{
int value;
struct BSTreeNode *left;
struct BSTreeNode *right;
};


/***************************************************
*
*Function name: Insert
*
*Info:use this function to insert node into the binarysrotree
* and the structure is stable.
*
*Arguments:BSTreeNode *p,the node of the tree to be run
* int x,the nodeinfo.
*
* ************************************************/


struct BSTreeNode *Insert(struct BSTreeNode *p,int x)
{
if(p == NULL)
{
p= (struct BSTreeNode *)malloc(sizeof(struct BSTreeNode));
p->value=x;
p->left=NULL;
p->right=NULL;
}
else
{
if(p->value >x)
{
p->left=Insert(p->left,x);
}
else
{
p->right=Insert(p->right,x);
}
}
return p;
}


/******************************************************
*
*Name: Traverse
*
*Info: run the binarysortree in middle rule
*
*Arguments:BSTreeNode *p, the node of the tree to be run of
*
* ***************************************************/


void Traverse(struct BSTreeNode *p)
{
if(p == NULL)
{
return;
}
Traverse(p->left);
printf("%d ",p->value);
Traverse(p->right);
}


/******************************************************
*
*Function Name:Convert
*
*Function Info:Change the BinarySortTree to List
*
*Arguments:BSTreeNode * node
*
*************************************************** */


struct BSTreeNode * Convert(struct BSTreeNode * node)
{
if(node == NULL)
{
return NULL;
}
struct BSTreeNode *leftMax,*rightMin;

leftMax=node->left;
rightMin=node->right;


/*Find the maxnode in the leftChildTree*/
while(leftMax != NULL && leftMax->right != NULL)
{
leftMax=leftMax->right;
}
/*Find the minnode in the rightChildTree*/
while(rightMin != NULL && rightMin->left != NULL)
{
rightMin=rightMin->left;
}
/*递归求解*/
Convert(node->right);
Convert(node->left);


/*Connect the leftchildtree and rightchildtree to the root ,as brothers
*/
if(leftMax != NULL)
{
leftMax->right=node;
}
if(rightMin != NULL)
{
rightMin->left=node;
}


node->left=leftMax;
node->right=rightMin;
return node;


}


/*------------------------------main-------------------------------------*/
int main()
{
/*切记--------初始化指针---------------!!
* 未初始话的指针可读不可写*/

struct BSTreeNode *p = NULL;

/*如果不初始化指针的话,在Insert函数递归调用中会出现段错误*/

int a[10]={5,3,6,7,4,2,1,15,8,12};
int i=0;

while(i<10)
{
p=Insert(p,a[i++]);
}
/*中序遍历二叉查找树*/
Traverse(p);
/*将二叉查找树转化成链表*/
Convert(p);
while(p != NULL)
{
printf("%d ",p->value );
p=p->right;
}


return 0;
}
大功告成!
分享到:
评论

相关推荐

    面试题36. 二叉搜索树与双向链表

    下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。 特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还...

    数据结构算法-Demo

    串的顺序存储、单链表结点的插入、单链表结点的删除、堆排序、二叉排序树的删除、二叉排序树的生成、二叉树的建立、二分查找、归并排序、基数排序、快速排序、邻接表表示的图的广度优先遍历、邻接表表示的图的深度...

    原创数据结构Flash演示动画(46个算法演示)

    串的顺序存储、单链表结点的插入、单链表结点的删除、堆排序、二叉排序树的删除、二叉排序树的生成、二叉树的建立、二分查找、归并排序、基数排序、快速排序、邻接表表示的图的广度优先遍历、邻接表表示的图的深度...

    leetcode卡-algorithm_notes:算法学习笔记

    二叉搜索树 哈夫曼树(赫夫曼树、最优树) 森林转化二叉树 图 连通图 生成树 普里姆算法(Prim算法)求最小生成树 克鲁斯卡尔算法(Kruskal算法)求最小生成树 顺序存储 邻接表存储 深度优先搜索 广度优先搜索 查找算法 ...

    数据结构讲义(严蔚敏版)(含算法源码)

    熟练掌握二叉排序树的概念,建立(A),查找(A,P),删除(A),计算ASL(C) 平衡二叉排序树的概念,建立(A),判断失去平衡的类型,平衡化(A),计算ASL(C) 了解B_树,B+树的概念和特点 知道键树(数字查找...

    Leetcode扑克-LeetCodeJava:leetcode刷题java

    Leetcode扑克 LeetCodeJava LeetCode部分习题Java版,包括多种解法,时间复杂度和空间...将二叉搜索树转化为排序的双向链表 Day25 二叉树的序列化与反序列化 Day26 数据流的中位数 Day27 最大子序和 Day28 数字 1 的

    精心整理史上最全的数据结构flash演示动画,共5个版本,祝大家考研成功!

    \数据结构flash演示\版本2\2.3 线性表的链式表示和实现-单链表到循环链表的转化.swf \数据结构flash演示\版本2\2.3 线性表的链式表示和实现-单链表的插入.swf \数据结构flash演示\版本2\2.3 线性表的链式表示和...

    学习数据结构算法必备

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    java算法与数据结构

    (5)树、二叉树与森林的转化方法 (6)哈夫曼树 (7)二叉排序树及平衡化 (8)堆排序树 (9)B-树 4.图形结构 (1)图的定义及存储结构 (2)图的深度优先和广度优先遍历。 (3)无向图的连通性和最小生成树 (4...

    c语言数据结构算法演示(Windows版)

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    严蔚敏 数据结构算法演示(Windows版)软件

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    数据结构算法演示(Windows版)

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    算法导论(part1)

    ·在第12.4节中,对随机构造二叉查找树的高度,给出了一个简单得多的分析。 ·对动态规划元素的讨论(第15.3节)和对贪心算法元素的讨论(第16.2节)大大地扩展了。关于活动选择问题的解释在贪心算法一章中开始出现...

    算法导论(part2)

    ·在第12.4节中,对随机构造二叉查找树的高度,给出了一个简单得多的分析。 ·对动态规划元素的讨论(第15.3节)和对贪心算法元素的讨论(第16.2节)大大地扩展了。关于活动选择问题的解释在贪心算法一章中开始出现...

    数据结构(C++)有关练习题

    2、利用二叉搜索树实现一个音像商店(小型书店、小型超市、或小型药店)的交易管理系统,要求实现以下功能: a. 该系统应该有一个字符型的主菜单; b. 能按字母顺序显示库存商品的名称和数量; c. 能添加...

    leetcode中文版-LeetCode:算法练习:LeetCode问题、LeetCode每周竞赛等

    leetcode中文版 LeetCode总结 所有的题目总结均在每一个package的README中 目录 搜索(回溯、BFS、DFS): 回溯:数独、N皇后、37...数字的转化:溢出检测、模拟运算(时刻注意溢出)、罗马、字符转成数字;分数转小数 其

    用c描述的数据结构演示软件

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    数据结构演示软件

    (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_...

    南理工初试试题

    3. 对关键字码集合K={53,30,37,12,45,24,96},从空二叉树出发建立与集合K对应的二叉排序树,若希望得到树的高度最小,应选择下列哪个输入序列 。 A)45,24,53,12,37,96,30 B)12,24,30,37,45,53,96 ...

Global site tag (gtag.js) - Google Analytics