题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解:
见代码注释
/*
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)
return NULL;
// pLastNodeInList记录双向链表的尾结点
TreeNode* pLastNodeInList = NULL;
Convert(pRootOfTree, &pLastNodeInList);
// 从后往前遍历,到最小值
TreeNode* head = pLastNodeInList;
while(head->left != NULL)
head = head->left;
return head;
}
void Convert(TreeNode* pRoot, TreeNode** pLastNodeInList){
if(!pRoot)
return;
// 如果左子树不为空,转换左子树
if(pRoot->left){
Convert(pRoot->left, pLastNodeInList);
}
// 将当前结点的左指针指向双向链表的最后一个结点
pRoot->left = *pLastNodeInList;
// 如果双向链表不为空(有可能左子树是空的),将双向链表最后结点的右指针指向当前结点
if(*pLastNodeInList != NULL){
(*pLastNodeInList)->right = pRoot;
}
// 将双向链表的最后一个结点切换成当前结点
*pLastNodeInList = pRoot;
// 如果右子树不为空,转换右子树
if(pRoot->right){
Convert(pRoot->right, pLastNodeInList);
}
}
};