题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
利用中序遍历即可从小到大排列,利用递归的思想,子树必须保存最左边和最右边的值。当前节点的左指针指向左子树最右边的值,右指针指向右子树最左边的值,并且要注意,如果左子树右子树都存在那么连接上当前节点后的最大最小值分别为左子树的最小值和右子树的最大值,如果没有左右子树,那么最大最小值都为当前节点,否则若只有左子树或者右子树,那么当前节点为最大值或者最小值。
代码如下:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
struct doubleretu{
struct TreeNode *min;
struct TreeNode *max;
doubleretu():min(NULL),max(NULL){}
doubleretu(TreeNode* head):min(head),max(head){}
};
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL)
return NULL;
doubleretu mid=recurConvert(pRootOfTree);
return mid.min;
}
doubleretu recurConvert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL)
return doubleretu();
if(pRootOfTree->left==NULL&&pRootOfTree->right==NULL)
return doubleretu(pRootOfTree);
TreeNode* tempright=pRootOfTree->right;
TreeNode* templeft=pRootOfTree->left;
doubleretu res;
if(templeft){
doubleretu leftnode=recurConvert(templeft);
(leftnode.max)->right=pRootOfTree;
pRootOfTree->left=leftnode.max;
res.min=leftnode.min;
}
else
{
res.min=pRootOfTree;
}
if(tempright){
doubleretu rightnode=recurConvert(tempright);
rightnode.min->left=pRootOfTree;
pRootOfTree->right=rightnode.min;
res.max=rightnode.max;
}
else
{
res.max=pRootOfTree;
}
return res;
}
};