题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:首先最小的数在极左节点,他的前一个节点为空。后一节点为其父节点。采用中序遍历将每个节点的前一个结点(会变,null开始)转换为双向的,再判断右节点,然后递归。
最后输出的节点变到头节点。
注意:变换需要保留前一节点,所以这里采用给一个空的节点
代码:
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
TreeNode* pre=nullptr;
if(pRootOfTree==nullptr ) return pre;
convert(pRootOfTree, pre);
TreeNode* res=pRootOfTree;
while(res->left)
res=res->left;
return res;
}
private:
void convert(TreeNode* cur, TreeNode* &pre)//注意引用
{
if(cur==nullptr)
return ;
//中序遍历
convert(cur->left, pre);
cur->left=pre;
if(pre) pre->right=cur; //双向,前提是不为空
pre=cur; //指针指向得值一旦改变了,之前得指针指向也会变,即使是递归嵌套
//屁,只是因为用的是引用
convert(cur->right, pre);
return;
}
};