Leetcode面试题36. 二叉搜索树与双向链表(C++)
题目:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
输入:[4,2,5,1,3]
输出:[1,2,3,4,5]
思路:
中序遍历(左根右),递归。
代码:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* head;
Node* tail;
Node* treeToDoublyList(Node* root) {
if(!root) return NULL;
head=NULL;
tail=NULL;
transform(root);
return head;
}
void transform(Node* root){
Node* lroot=root->left;
Node* rroot=root->right;
root->left=NULL;
root->right=NULL; //save children, isolate root
if(lroot) transform(lroot); //transform lroot
if(!head){
head=root;
head->left=root;
head->right=root;
} //if head is null,transform root to head
if(tail){
tail->right=root;
head->left=root;
root->left=tail;
root->right=head;
} //connect tail,head and root
tail=root; //start next
if(rroot) transform(rroot); //transform rroot
}
};