题目:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向
思路:
递归的对左右子树进行转换,然后将左右子树和当前根节点连接成链表
代码:
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(NULL == pRootOfTree)
{
return pRootOfTree;
}
TreeNode * pHead = pRootOfTree;
TreeNode * pTail = pRootOfTree;
convert(pRootOfTree, pHead, pTail);
return pHead;
}
void convert(TreeNode* pRootOfTree, TreeNode *& pHead, TreeNode *& pTail)
{
if(NULL != pRootOfTree->left)
{
TreeNode * pLeftHead = pRootOfTree->left;
TreeNode * pLeftTail = pRootOfTree->left;
convert(pRootOfTree->left, pLeftHead, pLeftTail);
pLeftTail->right = pRootOfTree;
pRootOfTree->left = pLeftTail;
pHead = pLeftHead;
}
if(NULL != pRootOfTree->right)
{
TreeNode * pRightHead = pRootOfTree->right;
TreeNode * pRightTail = pRootOfTree->right;
convert(pRootOfTree->right, pRightHead, pRightTail);
pRootOfTree->right = pRightHead;
pRightHead->left = pRootOfTree;
pTail = pRightTail;
}
}
};
上面代码临时变量过多
思路:
只需要一个额外指针,模拟中序遍历,按照遍历的顺序将节点连接起来
代码:
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(NULL == pRootOfTree)
{
return pRootOfTree;
}
TreeNode * pRoot = new TreeNode(-1);
TreeNode * pre = pRoot;
convert(pRootOfTree, pre);
pRoot->right->left = NULL;
return pRoot->right;
}
void convert(TreeNode* pRootOfTree, TreeNode*& pre)
{
if(NULL != pRootOfTree->left)
{
convert(pRootOfTree->left, pre);
}
pre->right = pRootOfTree;
pRootOfTree->left = pre;
pre = pRootOfTree;
if(NULL != pRootOfTree->right)
{
convert(pRootOfTree->right, pre);
}
}
};