二叉树深度学习——将二叉搜索树转化为排序的双向链表

1.题目解析

题目来源:LCR 155.将二叉搜索树转化为排序的双向链表

测试用例

2.算法原理

首先题目要求原地进行修改并且要求左指针代表前驱指针,右指针代表后继指针,所以思路就是

1.使用前序遍历创建两个指针cur、prev代表当前节点与前一个节点,然后将前一个节点的后继指向当前节点,当前节点的前驱指向上一个节点即可,需要注意的是第一次不能访问前一个节点,因为前一个节点一开始为空,避免对空指针进行操作

2.然后通过创建一个节点head = root,此时root这棵树已经前序遍历完成,使用不断地head =head->left最终访问到root这棵树的最小节点,然后将最小节点的前驱指向最大节点,最大节点的后继指向最小节点,完成循环链表的操作

3.实战代码

/*
// 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:
    void InOrder(Node* cur,Node*& prev)
    {
        if(cur == nullptr)
        {
            return;
        }

        InOrder(cur->left,prev);
        
        //创建两个指针,不断中序遍历修改指针
        cur->left = prev;
        //第一次的prev为空,避免对空指针进行访问
        if(prev)
        {
            prev->right = cur;
        }

        //更新后继续中序遍历
        prev = cur;

        InOrder(cur->right,prev);
    }
    Node* treeToDoublyList(Node* root) 
    {
        if(root == nullptr)
        {
            return nullptr;
        }

        Node* prev = nullptr;
        InOrder(root,prev);

        //通过不断向左递归找到最小的节点
        Node* head = root;
        while(head->left)
        {
            head = head->left;
        }

        //将最左边的节点的前驱指向最右边节点
        //最右边节点的后继指向最左边节点
        head->left = prev;
        prev->right = head;

        return head;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值