剑指 Offer 36. 二叉搜索树与双向链表

仅供自己学习

思路:
按照题目要求我们需要定义一个head头节点,并且因为树是二叉搜索树,所以要采取中序遍历才能得到从小到大的排序。
按照中序遍历的模板

dfs(root->left);
cout<<root->val;
dfs(root->right);

同样我们也通过这个模板写DFS,这里因为是双向的,所以需要一个pre来记录前一个结点。
首先判断root是否为空,不为空则进入dfs递归,dfs递归函数也需要判断传入的cur节点是否为空,如果不为空就再次进入dfs(cur->left),按照中序遍历模板。
然后递归出来之后判断pre是否为空,如果为空就将head指向cur,否则就pre->right=cur。为什么要有这几步判断呢,因为我们最开始定义head和pre都是空的,这个条件是为了head能指向第一个节点,之后都会是pre为非空就不会更改head了。然后将cur->left=pre,pre=cur,将cur->right传入dfs递归函数。这样就和中序遍历的模板一样。
当主函数dfs出来后,head指向了第一个节点,pre指向最后一个节点,那么我们在用head->left指向pre,pre->right指向head,即可完成双向循环链表。

代码:

/*
// 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* pre; Node* head;
    Node* dfs(Node* cur){
        if(cur==NULL) return NULL;
        dfs(cur->left);
        if(pre!=NULL) pre->right=cur;
        else head=cur;
        cur->left=pre;
        pre=cur;
        dfs(cur->right);
        return cur;
    }
    Node* treeToDoublyList(Node* root) {
        if(root==NULL) return NULL;
        dfs(root);
        head->left=pre;
        pre->right=head;
        return head;
    }
};
posted @ 2021-04-03 12:22  Mrsdwang  阅读(56)  评论(0编辑  收藏  举报