输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思想:在搜索二叉树中,左子结点的值总是小于父结点的值,右子结点的值总是大于父结点的值。因此我们在转换成排序双向联表时,原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向后一个结点的指针。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
TreeNode* ConvertNode(TreeNode* pNode,TreeNode* pLastNode){
if(pNode == NULL)
return NULL;
TreeNode* pCurrent = pNode;
if(pCurrent->left != NULL)
pLastNode = ConvertNode(pNode->left,pLastNode);
pCurrent->left = pLastNode;
if(pLastNode != NULL)
pLastNode->right = pCurrent;
pLastNode = pCurrent;
if(pCurrent->right != NULL)
pLastNode = ConvertNode(pNode->right,pLastNode);
return pLastNode;
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == NULL)
return NULL;
TreeNode* pLastNode = NULL;
pLastNode = ConvertNode(pRootOfTree,pLastNode);
if(pLastNode != NULL)
pLastNode->right = NULL;
TreeNode* pHead = pLastNode;
while(pHead != NULL && pHead->left != NULL)
pHead = pHead->left;
return pHead;
}
};