算法题_二叉搜索树与双向链表

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

思路:在二叉树中,每个节点都有指向左右两个子节点的指针。并且二叉搜索树是排序的二叉树,它的左子节点小于跟节点,跟节点小于右子节点,所以可以用中序遍历的方法遍历二叉树的每个节点。先排序左子节点,在连接根节点,在排序右子节点,这显然可以用递归的方法来做。

接下来我们用C++进行编程:

struct BinaryTreeNode
{
	int value;
	BinaryTreeNode* pleft;
	BinaryTreeNode* pright;
};

BinaryTreeNode* Convert(BinaryTreeNode* pRoot)
{
	BinaryTreeNode* Lasthead =nullptr;
	ConvertNode(pRoot, &Lasthead);

	//head指向双向链表的尾节点
	//我们需要返回头节点
	BinaryTreeNode* head = Lasthead;
	while(head -> pleft != nullptr && head != nullptr)
		head = head -> pleft;

	return head;
}

void ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode** Lasthead)
{
	if(pNode == nullptr)
		return;

	BinaryTreeNode* Current = pNode;
	if(Current -> pleft != nullptr)
		ConvertNode(Current -> pleft, Lasthead);

	Current -> left = *Lasthead;
	if(*Lasthead != nullptr)
		(*Lasthead) ->pright = Current;

	*Lasthead = Current;

	if(Current -> pright != nullptr)
		ConvertNode(Current -> pright, Lasthead);
}
发布了156 篇原创文章 · 获赞 48 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Rocky6688/article/details/104365800