题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
采用中序遍历方法,注意指针指向。left指向小于当前值的数,right指向大于当前值的数。
利用pLast来指向当前转换好的链表的最大值,即最后一个节点。
首先转换左子树,其次,连接上根节点,之后,转换右子树。
实现代码
<span style="font-size:18px;">
/*
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 *pLast = nullptr;
if(pRootOfTree == nullptr)
return nullptr;
ConvertTreeToList(pRootOfTree, &pLast);
TreeNode *pHead = pLast;
while(pHead->left != nullptr && pHead != nullptr)
pHead = pHead->left;
return pHead;
}
void ConvertTreeToList(TreeNode *root, TreeNode **pLast)
{
if(root == nullptr)
return;
TreeNode *pCurNode = root;
if(pCurNode->left != nullptr)
ConvertTreeToList(pCurNode->left, pLast);
pCurNode->left = *pLast;
if(*pLast != nullptr)
(*pLast)->right = pCurNode;
*pLast = pCurNode;
if(pCurNode->right != nullptr)
ConvertTreeToList(pCurNode->right, pLast);
}
};
</span>