二叉搜索树与双向链表 【第一题】

题目要求:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

解决思路:

  1. 根据观察可知,双向链表顺序即为二叉树的中序遍历结果----->采用中序遍历+递归;

  2. 中序遍历顺序为:左+中+右,传入一个变量pre。

    pre可以这样理解:当前结点的pre就是当前结点的前驱。如结点6的前驱是4,结点10的前驱是8.结点4的前驱是NULL。

#include <iostream>

using namespace std;

typedef struct BinaryTree
{
	struct BinaryTree *left,*right;
	int data;
}BinaryTree;

void initTree(BinaryTree **p);
void printList(BinaryTree *list);
BinaryTree *treeToList(BinaryTree *pTree);

int main(void)
{
	BinaryTree *pTree = NULL,*pList = NULL;

	initTree(&pTree);
	pList = treeToList(pTree);
	printList(pList);
	return 0;
}
//		1
//	   / //    2   3
//	 / //	4   5
void initTree(BinaryTree **p)
{
	*p = new BinaryTree;
	(*p)->data = 1;

	BinaryTree *tmpNode = new BinaryTree;
	tmpNode->data = 2;
	(*p)->left = tmpNode;

	tmpNode = new BinaryTree;
	tmpNode->data = 3;
	(*p)->right = tmpNode;
	tmpNode->left = NULL;
	tmpNode->right = NULL;

	BinaryTree *currentNode = (*p)->left;

	tmpNode = new BinaryTree;
	tmpNode->data = 4;
	currentNode->left = tmpNode;
	tmpNode->left = NULL;
	tmpNode->right = NULL;

	tmpNode = new BinaryTree;
	tmpNode->data = 5;
	currentNode->right = tmpNode;
	tmpNode->left = NULL;
	tmpNode->right = NULL;

}
void printList(BinaryTree *list)
{
	while(list!=NULL)
	{
		cout << list->data;
		if(list->right!=NULL)
		{
			cout << "<==>";
		}
		list = list->right;
	}
}//---------------核心代码-----------------------
void convert(BinaryTree *pTree,BinaryTree **pre)
{
	if(pTree == NULL)
		return;
	BinaryTree *pCurrent = pTree;
	if(pCurrent->left != NULL)
		convert(pTree->left,pre);

	//当前点的前驱为pre
	pCurrent->left = *pre;
	//pre不为NULL,pre的后继为当前点
	if(*pre != NULL)
		(*pre)->right = pCurrent;
	//pre为当前点
	*pre = pCurrent;

	if(pCurrent->right != NULL)
		convert(pTree->right,pre);
}
BinaryTree *treeToList(BinaryTree *pTree)
{
	BinaryTree *pre = NULL;

	convert(pTree,&pre);

	//按照初始化的树,链表为4<==>2<==>5<==>1<==>3
	//此时pre在结点3处,应该返回到结点4处,再遍历输出
	while(pre!=NULL && pre->left!=NULL)
		pre = pre->left;

	return pre;
}

  

时间: 2024-10-29 00:43:33

二叉搜索树与双向链表 【第一题】的相关文章

剑指OFFER之二叉搜索树与双向链表(九度OJ1503)

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果. 样例输入: 1 2 1 0 0 3 0 0 样例输出: 1 2 3 解题思路

【剑指offer】二叉搜索树转双向链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26623795 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成

二叉搜索树与双向链表的转换

题目:输入一棵二叉搜索树(记住是搜索树),将该二叉搜索树转换为一个排序的双向链表.要求:不能创建任何新的结点,只能调整树中结点指针的指向. 分析:如下图 因为是二叉搜索树.所以树的排列是规则的.通过中序遍历正好遍历的是由小到大的序列. 要求说明是只能改变树结点指针的指向,不能增加新的空间和结点.所以在中序遍历的时候,主要是遍历到结点后就去改变指针指向. 为了简单,采用递归进行遍历. 树的结构 struct BinaryTreeNode{ int m_data; BinaryTreeNode* m

编程算法 - 二叉搜索树 与 双向链表 代码(C++)

二叉搜索树 与 双向链表 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求不能创建不论什么新的结点, 仅仅能调整数中结点的指针的指向. 方法: 使用中序遍历每个结点, 并进行连接, 即左子树指前, 右子树指后, 并保存前一个节点. 本程序包括算法原理, 測试程序, 及 输出. /* * main.cpp * * Created on: 2014.6.12 * Author

二叉搜索树与双向链表-剑指Offer

二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 按中序遍历二叉搜索树可从小到大遍历元素 边遍历元素边创建双向链表 最后得到的双向链表的指针指向最后一个节点,所以需要再往回遍历一遍让指针指到头结点 代码 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public Tre

二叉搜索树与双向链表——27

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整树中结点指针的指向. 如上所示的二叉搜索树,转换成排序的双向链表就是5-><-6-><-7-><-8-><-9-><-10-><-11. 因为要求转换成双向链表,而恰好二叉树的每个结点都有两个指针,因此可以直接调整指针的指向:对于搜索二叉树,每个结点的左子树的值都比根结点的值要小,而每个右子树的值都比当前结点的值要大,而要求转换成排序的双向链

剑指offer (27) 二叉搜索树和双向链表

题目:输入一棵BST,将该BST转换成一个排序的双向链表 要求不能创建新的结点,只能调整树中结点指针的指向 在BST中,左子节点的值 小于父节点的之, 父节点的值小于 右子节点的值 因此我们在转换成有序的双向链表时,原先指向左子节点的指针调整为链表中指向前一个结点的指针 原先指向右子节点的指针调整为链表中指向后一个结点的指针 很自然的想到对BST进行中序遍历 当我们遍历转换到根节点(值为10的结点)时,它的左子树已经转换成 一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点 我们把

剑指offer之【二叉搜索树与双向链表】

题目: 二叉搜索树与双向链表 链接: https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指

24.二叉搜索树与双向链表

二叉搜索树与双向链表 参与人数:2316时间限制:1秒空间限制:32768K 算法知识视频讲解 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. // 25.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(i

数据结构-二叉搜索树与双向链表

题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 分析:首先不能创建新的结构,只能在树的前提下进行改变指针的指向.又由于是二叉搜索树,可以通过画图分析可知,二叉搜索树的左子树小于根节点小于右子树,可以发现是个递归过程也是一个中序遍历.所以只需要在中序那块进行指针调整. /* 剑指offer面试题27 */ #include <iostream> using namespace std; struct BinaryTree{