题目描述:
将一棵二叉查找树转换为有序的双向链表。
分析:
由于二叉查找树的特性,可以使用中续编历得到一个升序序列。基于此,可以改造得到一个升序的双向链表。其具体方步骤是:
使用递归的方式先找到最左叶子结点,使用一个last指针记录被操作过得最后一个结点。初始时,last = NULL,在每次递归中使得current->left = last;last->right = current(last != NULL 时);然后last = current(记录被操作的最后一个结点);接着递归的对右子树进行处理。
Node* treeToList(Node *tree);
void treeToList(Node* tree, Node** last);
Node* treeToList(Node* tree){
Node* last = NULL;
treeToList(tree, last);
Node* head = last; //由于last记录的是最后一个被操作的结点,所以结束时last指向链表的尾结点。
while(head != NULL && head->left != NULL) //找到链表表头
head = head->left;
return head;
}
void treeToList(Node* tree, Node** last){
if(tree == NULL)
return ;
Node* cur = tree;
if(cur->left != NULL)
treeToList(cur->left, last);
cur->left = *last;
if(*last != NULL)
(*last)->right = cur;
*last = cur;
if(cur->right != NULL)
treeToList(cur->right, last);
}