题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {}
};
*/
class Solution
{
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
TreeNode* pLastNodeInList=nullptr; //前一节点的指针
ConvertNode(pRootOfTree,&pLastNodeInList);
TreeNode* pHeadOfList=pLastNodeInList;
while(pHeadOfList!=nullptr&&pHeadOfList->left!=nullptr) //指针向前走到头结点
{
pHeadOfList=pHeadOfList->left;
}
return pHeadOfList; //返回链表头结点
}
void ConvertNode(TreeNode* pNode,TreeNode** pLastNodeInList)
{
if(pNode==nullptr)//根节点为空,返回
return;
TreeNode* pCurrent = pNode; //根节点为当前节点
if(pNode->left!=nullptr) //一直到左叶子节点
ConvertNode(pCurrent->left,pLastNodeInList);
pCurrent->left=*pLastNodeInList; //当前节点的前向指针
if(*pLastNodeInList!=nullptr) //前一节点不为空
(*pLastNodeInList)->right=pCurrent; //前一节点的后向指针指向当前节点
*pLastNodeInList=pCurrent; //前一节点指针向后走
if(pCurrent->right!=nullptr) //当前节点的右子树不为空
ConvertNode(pCurrent->right,pLastNodeInList);
}
};
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr) return nullptr;
TreeNode* pre = nullptr;
convertHelper(pRootOfTree, pre);
TreeNode* res = pRootOfTree;
while(res ->left)
res = res ->left;
return res;
}
void convertHelper(TreeNode* cur, TreeNode*& pre)
{
if(cur == nullptr) return;
convertHelper(cur ->left, pre);
cur ->left = pre;
if(pre) pre ->right = cur;
pre = cur;
convertHelper(cur ->right, pre);
}
};