`
fredric0611
  • 浏览: 28953 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

二叉查找树转换为排序的双向链表

 
阅读更多

#include <stdio.h>
#include <stdlib.h>

typedef struct BSTreeNode{
	int value;
	struct BSTreeNode *left;
	struct BSTreeNode *right;
} BSTreeNode;



void mid_traverse(BSTreeNode *n){
	if(n == NULL)
		return;
	mid_traverse(n->left);
	printf("%4d", n->value);
	mid_traverse(n->right);
}

BSTreeNode *insert_node(BSTreeNode *p, int v){
	if(p == NULL){
		p = (BSTreeNode *)malloc(sizeof(BSTreeNode));		
		p->value = v;
		p->left = NULL;
	 	p->right = NULL;
	}else{
		if(p->value > v){
			p->left = insert_node(p->left, v);
		}
		if(p->value < v){
			p->right = insert_node(p->right, v);
		}	
	}
	return p;
}

BSTreeNode *convert(BSTreeNode *p){
	if(p == NULL) return NULL;
	BSTreeNode *leftMax, *rightMin;
	leftMax = p->left;
	rightMin = p->right;
	if(leftMax != NULL && leftMax->right != NULL)
		leftMax = leftMax->right;
	if(rightMin != NULL && rightMin->left != NULL)
		rightMin = rightMin->left;
	convert(p->left);
	convert(p->right);
	if(leftMax != NULL)
		leftMax->right =  p;
	p->left = leftMax;
	if(rightMin != NULL)
		rightMin->left = p;
	p->right = rightMin;
	return p;
	
}

BSTreeNode *getLeast (BSTreeNode *p){
	while(p != NULL && p->left != NULL)
		p = p->left;	
	return p;
}

int main (void) {
	BSTreeNode *pRoot = NULL;
	BSTreeNode *pLeast = NULL;
	BSTreeNode *p;
	pRoot = insert_node(pRoot, 10);
	insert_node(pRoot, 6);
	insert_node(pRoot, 14);
	insert_node(pRoot, 4);
	insert_node(pRoot, 8);
	insert_node(pRoot, 12);
	insert_node(pRoot, 16);
	mid_traverse(pRoot);
	printf("\n");
	pLeast = getLeast(pRoot);
	printf("%d\n", pLeast->value);
	convert(pRoot);
	for(p=pLeast;p!=NULL;p=p->right)
		printf("%4d",p->value);
	return 1;
}
 
分享到:
评论

相关推荐

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

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为...

    C++将二叉树转为双向链表及判断两个链表是否相交

    把二叉查找树转变成排序的双向链表 例如: 转换成双向链表 4=6=8=10=12=14=16 struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // ...

    微软面试题(搜索树转双向链表)

    微软面试题,输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。适合新手入门结构清晰易懂

    【超全!】图解Java数据结构和算法(共195集)【资料+视频+课件+代码+笔记】

    稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...

    《剑指Offer》题目及代码.zip

    27. 二叉搜索树转换为双向链表 28. 打印字符串中所有字符的排列 29. 数组中出现次数超过一半的数字 30. 找出最小的K个数 31. 连续子数组的最大和 32. 从1到整数n中1出现的次数 33. 把数组中的数排成一个...

    数据结构习题答案(全部算法)严蔚敏版

    8.3.1 二叉排序树和二叉平衡树 8.3.2 B-树和B+树 8.4 哈希表及其查找 8.4.1 哈希表与哈希函数 8.4.2 构造哈希函数的常用方法 8.4.3 解决冲突的主要方法 8.5 哈希表算法实现C语言源程序 习题八 第9章 排序 ...

    C语言版数据结构与算法分析-严蔚敏经典视频教程

    09-004动态查找表:二叉排序树的插入和删除操作 09-005查找的性能分析、平衡二叉树、B-树的定义 09-006B-树的查找过程、B+树的定义与查找 09-007键树的结构特点、哈希表的定义、哈希表的构造方法 09-008哈希表的查找...

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

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

    数据结构算法实现(严蔚敏版配套实现程序)

    范例1-51 判断双向链表是否为空 126 ∷相关函数:ListEmpty函数 1.3.21 双向链表元素值的查询 129 范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立...

    Java数据结构与算法-笔记-代码-课件-资料

    稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...

    数据结构 严蔚敏 代码

    范例1-51 判断双向链表是否为空 126 ∷相关函数:ListEmpty函数 1.3.21 双向链表元素值的查询 129 范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立...

    数据结构(王)c元代码

    范例1-51 判断双向链表是否为空 126 ∷相关函数:ListEmpty函数 1.3.21 双向链表元素值的查询 129 范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立...

    数据结构算法实现(严蔚敏版配套实现程序)

    范例1-51 判断双向链表是否为空 126 ∷相关函数:ListEmpty函数 1.3.21 双向链表元素值的查询 129 范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立...

    front-end-interview-code:一些前端编程题

    在指定空间中创建对象数组去重时间格式化获取字符串长度邮箱字符串判断颜色字符串转换字符串转为驼峰格式字符串字符统计剑指offer二维数组中的查找替换空格从尾到头打印链表重建二叉树用两个栈实现队列旋转数组的...

    lrucacheleetcode-Codes:学习编程

    lru缓存leetcode 学习和探索编程 C、C++、Python 探索领域: 1 数组 二分搜索、在滑动窗口中查找...,将二叉树转换为双向链表,打印树边界、连接同级兄弟、序列化/反序列化二叉树、连接所有兄弟、带父指针的中序后继 BS

    严蔚敏 数据结构(C语言版) 代码 23490 书中算法

    2.3.4 双向链表 32 2.4 线性表的应用 34 2.4.1 一般线性表的合并 34 2.4.2 有序表的合并 35 2.4.3 一元多项式的表示及相加 37 2.5 小结 40 习题 41 第3章 栈和队列 44 3.1 栈 44 3.1.1 栈的类型...

    数据结构与算法分析C描述第三版

     4.3 查找树ADT——二叉查找树   4.3.1 contains   4.3.2 findMin和findMax   4.3.3 insert   4.3.4 remove   4.3.5 析构函数和复制赋值操作符   4.3.6 平均情况分析   4.4 AVL树   4.4.1...

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

    \数据结构flash演示\版本1\9-3-2二叉排序树查找.swf \数据结构flash演示\版本1\9-3-3二叉排序树建立.swf \数据结构flash演示\版本1\9-3-4二叉排序树删除.swf \数据结构flash演示\版本1\9-3-5二叉排序树删除.swf ...

    严蔚敏:数据结构题集(C语言版)

    2.3.3 双向链表 2.4 一元多项式的表示及相加 第3章 栈和队列 3.1 栈 3.1.1 抽象数据类型栈的定义 3.1.2 栈的表示和实现 3.2 栈的应用举例 3.2.1 数制转换 3.2.2 括号匹配的检验 3.2.3 行编辑程序 3.2.4 迷宫求解 ...

    数据结构与算法分析

     4.3 查找树ADT——二叉查找树   4.3.1 contains   4.3.2 findMin和findMax   4.3.3 insert   4.3.4 remove   4.3.5 析构函数和复制赋值操作符   4.3.6 平均情况分析   4.4 AVL树  ...

Global site tag (gtag.js) - Google Analytics