题目:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
链接:
剑指Offer(第2版):P191
思路标签:
- 算法:递归
- 数据结构:链表
解答:
1. C++
- 因为题目中规定,不能创建任何新的结点,所以我们只能以树节点本身最后作为链表节点;
- 同时,题中要求转换为一个排序的双向链表,根据二叉搜索树的特性,我们需要使用“中序遍历”对树节点进行遍历排序;
- 加入一个总是指向链表当前最后一个结点的指针,在遍历的过程中不断在链表尾部添加树结点;
- 另外,我们需要返回的是双向链表的头指针,所以还需要在链表转换完成后,依照链表反向找回到其头结点;
- 最后,需要注意的是,我们在递归函数中传递的是指向最后一个结点指针的指针。
/*
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(pCurrent->left)
ConvertNode(pCurrent->left, pLastNodeInList);
pCurrent->left = *pLastNodeInList;
if(*pLastNodeInList != nullptr)
(*pLastNodeInList)->right = pCurrent;
*pLastNodeInList = pCurrent;
if(pCurrent->right)
ConvertNode(pCurrent->right, pLastNodeInList);
}
};