题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
思路:在二叉树中,每个节点都有指向左右两个子节点的指针。并且二叉搜索树是排序的二叉树,它的左子节点小于跟节点,跟节点小于右子节点,所以可以用中序遍历的方法遍历二叉树的每个节点。先排序左子节点,在连接根节点,在排序右子节点,这显然可以用递归的方法来做。
接下来我们用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);
}