题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
在《剑指offer》书中提供的思路如下:首先,中序遍历一颗二叉树,产生的序列和双向链表产生的序列相同,我们可以单独设置一个指针rootlast指向该二叉树产生的双向链表的尾部,当我们遍历到某个节点的时候,把该节点的左指针指向rootlast,因为遍历完该节点的左子树之后,左指针就没用了。之后再把rootlast的右指针指向该节点,最后把该节点赋值给rootlast即可,代码如下:
class Solution {
private:
TreeNode * lastRoot = nullptr;
public:
TreeNode * Convert(TreeNode* pRootOfTree)
{
if (pRootOfTree == nullptr) return lastRoot;
CenterRead(pRootOfTree);
while (lastRoot->left != nullptr) {
lastRoot = lastRoot->left;
}
return lastRoot;
}
void CenterRead(TreeNode* root) {
if (root == nullptr) return ;
CenterRead(root->left);
root->left = lastRoot;
if (lastRoot != nullptr)
lastRoot->right = root;
lastRoot = root;
CenterRead(root->right);
return ;
}
};
下图展示的是部分二叉搜索树,这里lastroot已经指向了节点8,代码中的1,2,3步骤,对应下面的步骤
