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

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何

新的结点,只调整指针的指向。

比如将二元查找树

10

/ \

6 14

/ \ / \

4 8 12 16

转换成双向链表

4=6=8=10=12=14=16。

思路:对于树的很多题目,都可以使用递归的方法来处理。这道题目也不例外。我们从最基本的思路来考虑这个题目。

把一个二叉树编程双向链表,最终是一个有序的序列,也就是中序遍历之后的结果,那么当我们采用中序遍历的方式遍历二叉树时,遍历到某个节点,是的前序节点的右指针指向当前节点,然后当前节点的左指针指向前序节点,然后使得前序节点指向当前节点。

BinTree* head =NULL;
void helper(BinTree* root,BinTree*& pre)
{
	if(root == NULL && root == NULL)
		return ;

	helper(root->left,pre);
	if(head == NULL)
		head = root;
	if(pre == NULL)
		pre = root;
	else
	{
		root->left = pre;
		pre->right = root;
		pre = root;
	}
	//cout<<root->value<<"  "<<endl;
	helper(root->right,pre);
}
BinTree* SearchTreeConverstToList(BinTree* root)
{
	BinTree* pre = NULL;
	helper(root,pre);
	return head;
}

思路二:如果对于当前节点,我们把右子树转换成双向链表,然后把左子树转换成双向链表,转换的时候我们都标记了链表的头节点和尾节点,那么我们只需要将当前节点和左子树的尾部相连,和右子树的头部相连即可。

void helper_second(BinTree* root,BinTree*& head,BinTree*& tail)
{
	if(root==NULL || (root->left == NULL && root->right == NULL))
	{
		head = root;
		tail = root;
		return;
	}
	BinTree* left_head = NULL;
	BinTree* left_tail = NULL;
	BinTree* right_head = NULL;
	BinTree* right_tail = NULL;

	helper_second(root->left,left_head,left_tail);
	helper_second(root->right,right_head,right_tail);

	if(left_head == NULL)
		head = root;
	else
	{
		head = left_head;
		left_tail->right = root;
		root->right = left_tail;
	}
	if(right_head == NULL)
		tail = root;
	else
	{
		tail = right_tail;
		root->right = right_head;
		right_head->left = root;
	}
}

BinTree* ConverstToList(BinTree* root)
{
	BinTree* head=NULL;
	BinTree* tail = NULL;
	helper_second(root,head,tail);
	return head;
}
时间: 2024-12-30 16:20:06

二叉查找树转换成排序的双向链表的相关文章

数据结构——树——二叉查找树转换成排序的循环双向链表

题目描述 输入一棵二叉查找树,将该二叉查找树转换成一个排序的循环双向链表. 要求不能创建任何新的结点,只调整指针的指向,也不能开辟新的存储空间O(1) 题目分析 首先照旧我们问题的解决思路,首先简化问题.(前提你应该了解二叉查找树和双向链表) 如果没有任何的要求,那么我们自然会想到遍历整棵树然后排序出来之后重新构建一个链表即可,你想要什么样的都可以. 那么我们需要考虑的就是如何遍历? 然后慢慢复杂问题,不能新建立,那么就要在原来的基础上改,怎么改才能变过去呢? 这时,我要教你对于树的问题,有一招

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

分析: 1. 二叉树的中序遍历正好是排好序的遍历方式,因此可以采用中序递归的方式来处理: 2. 可以用类似输出流的方式来"输出"节点到链表末尾: 3. 可以用局部变量来简化判断,优化程序. 程序: typedef struct tagTreeNode_s { int nValue; tagTreeNode_s* pLeftNode; tagTreeNode_s* pRightNode; } TreeNode_s; void AppendNode(TreeNode_s* pNode, T

将二叉查找树转换成有序双向链表

一.问题描述 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表.而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现. 二.实现思路 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值.而在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点.所以这两种数据结构的结点是一致,二叉搜索树之所以为二叉搜索树,双向链表之所以为双向链表,只是因为两个指针的指向不同而已,通过

MS - 把二元查找树转变成排序的双向链表

## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10        /   \       6     14      /  \  /  \     4   8 12  16  转换成双向链表 4=6=8=10=12=14=16. 首先我们定义的二元查找树节点的数据结构如下: 1 struct BSTreeNode 2 { 3 int m_nValue; //

【编程题目】把二元查找树转变成排序的双向链表(树)

1.把二元查找树转变成排序的双向链表(树)题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10 / \ 6 14 / \ / \ 4 8 12 16转换成双向链表4=6=8=10=12=14=16.首先我们定义的二元查找树 节点的数据结构如下:struct BSTreeNode{int m_nValue; // value of nodeBSTreeNode *m_pLeft; // left child of nodeBSTree

将二叉搜索树转变成排序的双向链表

将二叉搜索树转变成排序的双向链表: 点击链接: http://blog.csdn.net/l_tudou/article/details/51753921

二元查找树转化成排序的双向链表——要求不创建新的节点

码完第一次编译运行居然就成功了...高兴~ 问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向.例如: 10 /    \ 6     14 / \      /  \ 4   8  12  16 转换成双向链表 4=6=8=10=12=14=16 算法: 如果没有"不能创建任何新的结点"的限制,只需进行一次中序遍历,对每个节点的data值构造一个新节点即可. 由于条件限制,现在我们只能用现有的节点,调整他们的指针指向,把

Java实现: 把二元查找树转变成排序的双向链表(树)

题目 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10 /    \ 6      14 /   \     /   \ 4    8  12   16 转换成双向链表4=6=8=10=12=14=16. 首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode{ int m_nValue; // value of node BSTreeNode *m_pLeft;// left child of node

算法-1.把二元查找树转变成排序的双向链表

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向. 如下图.    10 /\ 6    14 /\     /\ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16. 这是一种二叉树的中序遍历. typedef struct BSTreeNode { int data; struct BSTreeNode *m_pLeft; struct BSTreeNode *m_pRight; }BSTreeNode,*pBSTr