`
jiq408694711
  • 浏览: 36551 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

将二叉排序树BST转换成排序的双向链表

 
阅读更多
#include <iostream>
using namespace std;
/**
* 递归实现将二叉排序树BST转换成排序的双向链表。
* 递归左子树,将左子树的转换成的链表的尾节点和当前根节点连接,
* 然后当前根节点更新尾转换好链表的尾节点。 递归右子树
*/
typedef struct node{
	int value;
	struct node *lchild;
	struct node *rchild;
}NODE;

NODE *createNode(int v){
	NODE *p = (NODE *)malloc(sizeof(NODE));
	p->value = v;
	p->lchild = NULL;
	p->rchild = NULL;
	return p;
}

//创建一棵树作为测试
NODE *buildTree(){
	NODE *root,*p,*q;
	root = createNode(8);	
	p = createNode(4);
	root->lchild = p;	
	q = createNode(3);
	p->lchild = q;
	q = createNode(6);
	p->rchild = q;
	p = q;
	q = createNode(5);
	p->lchild = q;
	p = createNode(10);
	root->rchild = p;	
	q = createNode(9);
	p->lchild = q;
	q = createNode(12);
	p->rchild = q;
	return root;
}

/**
* 将BST递归转换成双向排序链表,随时维护已转换好的链表的尾节点
*/
void transformToList(NODE *root, NODE **listLastNode){
	//空节点,不进行任何转换
	if(root == NULL) return;

	//如果左子树不空,递归左子树
	if(root->lchild != NULL){
		transformToList(root->lchild, listLastNode);
	}

	//将自己和左子树转换成的链表的最后一个节点相互连接
	if(*listLastNode != NULL) (*listLastNode)->rchild = root;
	root->lchild = *listLastNode;

	//把当前节点作为转换好的链表的尾节点,递归处理右子树
	//右子树递归到最左孩子的时候,会和listLastNode相互连接的
	*listLastNode = root;
	if(root->rchild != NULL){
		transformToList(root->rchild, listLastNode);
	}
}

int main(){
	NODE *listLastNode = NULL;
	NODE *root = buildTree();
	
	//转换
	transformToList(root, &listLastNode);
	
	//逆序输出
	while(listLastNode != NULL){
		cout<<listLastNode->value<<" ";
		listLastNode = listLastNode->lchild;
	}
	cout<<endl;
	return 0;
}


分享到:
评论

相关推荐

    面试题27_二叉搜索树与双向链表

    而将一个二叉搜索树转换成一个排序的双向链表,则可以利用其天然的有序性,优化某些特定算法的实现,如在链表中进行连续操作。 题目“剑指offer”中的面试题27,就是关于这个转换过程。这个过程的核心在于如何通过...

    二叉搜索树与双向链表1

    在本题中,我们面临的任务是将一棵二叉搜索树转换为一个排序的循环双向链表。 双向链表(Doubly Linked List)是一种数据结构,其中每个节点包含两个指针,一个指向前一个节点(前驱),另一个指向后一个节点(后继...

    Python二叉搜索树与双向链表转换算法示例

    在本文中,我们将深入探讨如何将一个Python实现的二叉搜索树(Binary Search Tree, BST)转换为一个排序的双向链表(Doubly Linked List)。这个过程涉及到对二叉树的基本操作,如构建、遍历以及链表的构造。 首先...

    程序员面试题精选100题

    ### 知识点详解:将二叉查找树转换为排序的双向链表 #### 核心概念解析: 在计算机科学中,**二叉查找树**(Binary Search Tree, BST)是一种特殊的二叉树数据结构,其中每个节点具有以下特性: - 左子树中的所有...

    程序员面试精选100题

    ### 知识点详解:将二叉查找树转换为排序的双向链表 #### 核心概念解析 在计算机科学中,**二叉查找树(Binary Search Tree, BST)**是一种特殊的二叉树,其中每个节点的值都大于或等于其左子树中的任何节点的值,...

    程序员面试精选100题.pdf

    然而,有时候我们需要将二叉查找树转换成其他形式的数据结构,如排序的双向链表,以适应不同的应用场景或提高某些操作的效率。 #### 题目解析与解决方案 **题目概述**:给定一个二叉查找树,任务是将其转换成一个...

    面试算法一百题

    ### 知识点二:二叉查找树转换为排序双向链表的问题背景 在实际工作中,有时需要对二叉查找树中的元素进行有序排列,并转换为一种线性结构以提高某些特定操作的效率。例如,将二叉查找树转换为排序的双向链表可以...

    微软等公司数据结构算法面试题目

    根据提供的文档信息,本文将对“微软等公司数据结构算法面试题目”进行深入解析,重点关注文档中的关键知识点,包括但不限于二叉查找树转化为排序的双向链表这一具体问题。 ### 关键知识点概述 #### 1. 二叉查找树...

    精选微软数据结构%2B算法面试100题之解决方案[上]

    ### 知识点一:二叉查找树转为排序双向链表 #### 题目描述 本题目要求实现的功能是将一棵给定的二叉查找树(Binary Search Tree, BST)转换为一个有序的双向链表。在这个过程中,不能创建任何新的节点,即必须通过...

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

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

    数据结构课程设计

    最后,二叉排序树(Binary Sort Tree,BST)。这是一种自平衡的二叉查找树,其中每个节点的左子树只包含小于当前节点的值,右子树包含大于当前节点的值。二叉排序树支持快速的查找、插入和删除操作,平均时间复杂度...

    [答案V0.1版]精选微软数据结构+算法面试100题[前25题]

    ### 数据结构与算法面试题目解析——二叉查找树转排序双向链表 #### 题目背景 在IT行业,特别是软件开发领域,数据结构与算法是衡量一个程序员技术水平的重要标准之一。很多知名科技公司在招聘过程中会设置专门的...

    程序员面试题精选100题完整版

    ### 知识点一:二叉查找树转排序双向链表 #### 1.1 问题背景 在软件开发行业中,数据结构与算法是程序员必须掌握的基础技能之一,尤其是在求职过程中,这部分知识更是考察的重点。其中,二叉查找树(Binary Search ...

Global site tag (gtag.js) - Google Analytics