题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
1、树为空,直接返回
2、树只有一个节点,将其根节点返回
3、定义一个指针pre指向访问过的节点,然后使用递归的思想实现
4.递归左子树,找到最左边节点
5.将当前节点的左指针指向pre,如果pre不为空,将pre的右指针指向当前节点
6.递归右子树
7、定义一个头指针,然后将其指向新链表的头部,返回。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void ConvertSub(TreeNode* pCur,TreeNode*& pre)
{
if(pCur==NULL)
return;
//找最左边节点
if(pCur->left)
ConvertSub(pCur->left,pre);
pCur->left=pre;//left
//改变指针指向
if(pre!=NULL)
pre->right=pCur;//right
pre=pCur;
//处理右子树
if(pCur->right)
ConvertSub(pCur->right,pre);
}
TreeNode* Convert(TreeNode* pRootOfTree){
if(pRootOfTree==NULL)
return NULL;
if(pRootOfTree->left==NULL&&pRootOfTree->right==NULL)
return pRootOfTree;
TreeNode* pre=NULL;
TreeNode* head=NULL;
ConvertSub(pRootOfTree,pre);
head=pre;
while(head->left)
head=head->left;
return head;
}
};