剑指offer36.将BST原地转换为双向循环链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

 特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

注意点:

  • 中序遍历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;
    }
};

 

posted @ 2020-04-07 16:24  betaa  阅读(175)  评论(0编辑  收藏  举报