1.问题描述
输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。(来自《剑指offer》)
2.分析
对于二叉搜索树我们知道,树的左孩子都比根节点要下,树的右孩子都比根结点要大,根据这个特点,我们进行中序遍历得到的序列就会满足题目的要求,我们另外需要做的就是对结点的指针进行操作,记录一下上次访问的元素,将当前元素的left指针指向上次访问的元素,在把上次访问的元素的right指针指向当前元素即可。
3.代码
void converse(TreeNode* node,TreeNode** LastNodeInList)
{
if (node == NULL)
{
return;
}
TreeNode *current = node;
if (current->lChild != NULL)
{
converse(current->lChild,LastNodeInList);
}
current->lChild = *LastNodeInList;
if (*LastNodeInList != NULL)
{
(*LastNodeInList)->rChild = current;
}
*LastNodeInList = current;
if (current->rChild)
{
converse(current->rChild,LastNodeInList);
}
}