输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof
首先二叉搜索树的中序遍历得到的结果是有序的,我们需要在中序遍历的过程中改变节点left和right指针的指向,然后结束后将头节点的left指针指向尾部,尾节点的指针指向头部即可。注意头节点是中序遍历访问到的第一个节点
/*
// 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* head = nullptr;
Node* pre = nullptr;
public:
void dfs(Node* cur) {
if (cur == nullptr) {
return ;
}
dfs(cur->left);
if (pre == nullptr)
//第一次找到了根节点
head = cur;
else
//其他情况下前一节点和当前节点交换
pre->right = cur;
cur->left = pre;
//前一节点望前移
pre = cur;
dfs(cur->right);
}
Node* treeToDoublyList(Node* root) {
if (root == nullptr)
return nullptr;
dfs(root);
head->left = pre;
pre->right = head;
return head;
}
};