解题笔记(4)——把二元查找树转变成排序的双向链表

      问题描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
   10
  / /
  6  14
 / / / /
4  8 12 16
 转换成双向链表

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

   思路:利用递归的思想求解,分别调整某结点的左右子树,调整完后,将该结点的左指针指向左子树的最大节点,右指针指向右子树的最小节点。

   代码如下:

BSTreeNode * Convert(BSTreeNode *node)
{
	if(node == NULL)
		return NULL;
	BSTreeNode *leftMax,*rightMin;
	leftMax = node->left;    
	rightMin = node->right;
	//找到左子树的最大结点
	while(leftMax != NULL && leftMax->right != NULL)
		leftMax = leftMax->right;
	//找到右子树的最小结点
	while(rightMin != NULL && rightMin->left != NULL)
		rightMin = rightMin->left;
	//递归求解
	Convert(node->right); 
	Convert(node->left);
	//将左右子树同根结点连起来,只不过是以兄弟的关系
	if(leftMax != NULL)
		leftMax->right = node;
	if(rightMin != NULL)
		rightMin->left = node;
	node->left = leftMax;
	node->right = rightMin;
	return node;
}

   测试当中,需要建立二叉搜索树,下面给出建立及遍历二叉树的代码。

struct BSTreeNode
{
	int value;
	BSTreeNode *left;
	BSTreeNode *right;
};
BSTreeNode * Insert(BSTreeNode *p, int x)
{
	if(p == NULL)
	{
		p = new BSTreeNode;
		p->value = x;
		p->left = NULL;
		p->right = NULL;
	}
	else
	{
		if(p->value > x)
			p->left = Insert(p->left, x);
		if(p->value < x)
			p->right = Insert(p->right, x);
	}
	return p;
}
void Traverse(BSTreeNode *p) //中序遍历
{
	if(p == NULL)
		return;
	Traverse(p->left);
	cout<<p->value<<' ';
	Traverse(p->right);
}

   本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985

你可能感兴趣的:(解题笔记(4)——把二元查找树转变成排序的双向链表)