题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向
思路
二叉搜索树的中序序列就是排序的,中序遍历的时候转换下结点left和right指针,用一个pre指针引用记录前一个结点,最开始是nullptr,
然后把剩余部分最小结点left指向它,如果它非空,把它的right指向该结点,结束时它指向最右,然后因为是双向链表,一直找到最左就可以
code
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void inorder(TreeNode* pRoot,TreeNode*&pre){
if(pRoot==nullptr)
return ;
inorder(pRoot->left,pre);
pRoot->left=pre;
if(pre)
pre->right=pRoot;
pre=pRoot;
inorder(pRoot->right,pre);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==nullptr)
return nullptr;
TreeNode* pre=nullptr;
inorder(pRootOfTree,pre);
TreeNode* pRoot=pre;
while(pRoot->left)
pRoot=pRoot->left;
return pRoot;
}
};