输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
注意点:
- 中序遍历BST即为排序序列
- 建立dummy节点,简化代码
/* // 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 dummy(0); wrong Node dummy; Node *pre = &dummy, *head = pre; void dfs(Node* cur) { if (!cur) return; //中序遍历 dfs(cur->left); // 对当前节点的操作,建立dummy节点处理更方便 pre->right = cur; cur->left = pre; pre = cur; dfs(cur->right); } Node* treeToDoublyList(Node* root) { if (!root) return root; dfs(root); // 处理首尾节点,首节点left指向尾节点,尾节点right指向首节点 head = head->right; head->left = pre; pre->right = head; return head; } };