输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
思路:
二叉搜索树的中序遍历结果就是排序的。所以对二叉树进行中序遍历,遍历的过程中进行指针的调整,遍历完成就调整完毕。
代码:
/*
// 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 {
private:
Node* pre;
Node* head;
public:
void turnup(Node* cur) {
if (cur == nullptr) {
return;
}
turnup(cur->left);
if (head == nullptr) {
head = cur;
}
else {
pre->right = cur;
cur->left = pre;
}
pre = cur;
turnup(cur->right);
}
Node* treeToDoublyList(Node* root) {
if (root == nullptr) {
return root;
}
turnup(root);
head->left = pre;
pre->right = head;
return head;
}
};