剑指 Offer 36. 二叉搜索树与双向链表 - 力扣(LeetCode)
与leetcode 426相同。
题意就是将二叉树中的left,right指针改为双向链表中的前驱,后继指针。
既然是二叉搜索树,双向链表又要求顺序,那肯定就是使用中序遍历了,遍历的过程中一边遍历一边调整指针指向,最后将头尾相连即可。
如果可以借助外部空间,那中序遍历将节点导入数组,再依次连接是最简单的,或者使用迭代法借助栈也可以。
不借助外部空间,递归,链表头结点应为二叉树的最小值(最左边的节点):
class Solution {
public:
//left, right对应前驱、后继
Node *head = NULL, *cur = NULL;//当前节点,上一个节点
void inorder(Node* root){//中序遍历
if(root->left) inorder(root->left);
if(!head){
head = root;
cur = root;
}else{
cur->right = root;
root->left = cur;
cur = root;
}
if(root->right) inorder(root->right);
}
Node* treeToDoublyList(Node* root) {
if(!root) return NULL;
inorder(root);
head->left = cur;//首尾相连
cur->right = head;
return head;
}
};