题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
解题思路:
题目要求得到排序的链表,所以中序遍历二叉搜索树。在遍历的过程中进行节点的左右连接。
代码
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if(!root) return NULL;
stack<Node*> s; // 定义栈s存储遍历的节点
Node* p = root;
Node* head = NULL; //定义循环链表的头指针
Node* tail = NULL; //定义循环链表的尾指针
while(p != nullptr || !s.empty()){
while(p != nullptr){
s.push(p);
p = p->left;
}
if(!s.empty()){
p = s.top();
s.pop();
if(tail == nullptr){
head = p; //弹出的第一个节点为头指针
tail = p;
}
else{ // 节点进行左右连接
tail->right = p;
p->left = tail;
tail = p; //尾指针移动
}
p = p->right;
}
}
// 头尾指针连接形成循环链表
tail->right = head;
head->left = tail;
return head;
}
};