题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路:按照本题的意思,我们能想到的就是根据二叉树的中序遍历,因为中序遍历是:左子树–>跟–>右子树,由于二叉搜索树它的根节点大于左子树,小于右子树的,所以,只要我们将跟的左指向它左子树中最大的一个子树,让它跟的右指向右子树中最小的元素,就做到了将二叉搜索树变成了一个有序的双向链表。
代码实现如下:
/*
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)
{
if(pRootOfTree==NULL)
return NULL;
TreeNode* pLastNode=NULL;
ConvertNode(pRootOfTree,&pLastNode);
TreeNode* head=pLastNode;
while(head!=NULL && head->left!=NULL)
{
head=head->left;
}
return head;
}
void ConvertNode(TreeNode* pNode,TreeNode** pLastNode)
{
if(pNode==NULL)
return;
TreeNode* cur=pNode;
if(cur->left!=NULL)
{
ConvertNode(cur->left,pLastNode);
}
cur->left=*pLastNode;
if(*pLastNode!=NULL)
{
(*pLastNode)->right=cur;
}
*pLastNode=cur;
if(cur->right!=NULL)
{
ConvertNode(cur->right,pLastNode);
}
}
};