题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/*
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* tail = NULL; //设tail为双向链表的最后一个节点
Change(pRootOfTree, &tail);
TreeNode* head = tail; //设head为双向链表的第一个节点
while(head -> left != NULL) {
head = head -> left;
}
return head;
}
void Change(TreeNode* node, TreeNode** tail) {
TreeNode* temp = node;
if(node -> left != NULL) {
Change(node -> left, tail);
}
//将当前节点加在双向链表的最后
//先使当前的节点与链表的最后一个节点互指
temp -> left = *tail;
if(*tail != NULL) { //注意这里一定要加判断条件
(*tail) -> right = temp;
}
//将当前节点赋给最后一个节点
*tail = temp;
if(node -> right != NULL) {
Change(node -> right, tail);
}
}
};