每天一道leetcode:剑指 Offer 36. 二叉搜索树与双向链表(中等&深度优先遍历&递归)

今日份题目:

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

示例

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。"head" 表示指向链表中有最小元素的节点。

题目思路

根据二叉搜索树的性质,我们知道,中序遍历可以得到树节点的从小到大的排序,那我们就在中序递归遍历的基础上改变链表。使用pre节点记录上个节点的位置,使用cur节点记录当前节点的位置,使用head节点记录链表头部的位置,然后每次让pre节点和cur节点互相指,pre左cur右,最后让head和pre节点相互指就能得到结果链表了。具体看代码注释。

补充:中序遍历

树的一种遍历方法,遍历顺序是左->根->右,如果左或右是树而非节点,那么就在子树中继续左根右,最后递归得到顺序。

cpp 复制代码
int inOrder(Node* root)
{
    if(root->left) inOrder(root->left);
    return root->val;
    if(root->right) inOrder(root->right);
}

代码

cpp 复制代码
/*
// 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,*head;
    void dfs(Node* cur) 
    {
        if(cur==NULL) return;
        //中序遍历
        dfs(cur->left);
        //左边pre,右边cur,二者相连,pre继续向后走直到结束
        if(pre!=NULL) pre->right=cur;
        else head=cur;
        cur->left=pre;
        pre=cur;
        dfs(cur->right);
    }

    Node* treeToDoublyList(Node* root) 
    {
        if(root==NULL) return NULL;
        dfs(root);
        //中间连好了,头尾相连
        head->left=pre;
        pre->right=head;
        return head;
    }
};

提交结果

欢迎大家在评论区讨论,如有不懂的部分,欢迎在评论区留言!

更新不易,宝子们点个赞支持下,谢谢!

相关推荐
自动驾驶小卡24 分钟前
boost::circular_buffer的使用方法简介
c++·boost·circular_buffer
Greedy Alg2 小时前
LeetCode 142. 环形链表 II
算法
睡不醒的kun2 小时前
leetcode算法刷题的第三十二天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
先做个垃圾出来………3 小时前
残差连接的概念与作用
人工智能·算法·机器学习·语言模型·自然语言处理
乔宕一4 小时前
stm32 链接脚本没有 .gcc_except_table 段也能支持 C++ 异常
c++·stm32·嵌入式硬件
SuperCandyXu4 小时前
P3205 [HNOI2010] 合唱队-普及+/提高
c++·算法·洛谷
_OP_CHEN5 小时前
数据结构(C语言篇):(十二)实现顺序结构二叉树——堆
c语言·数据结构·算法·二叉树·学习笔记··顺序结构二叉树
_君落羽_5 小时前
ARM寄存器以及异常处理
c++
Yingjun Mo5 小时前
1. 统计推断-基于神经网络与Langevin扩散的自适应潜变量建模与优化
人工智能·神经网络·算法·机器学习·概率论
free5 小时前
基于librdkafa C++客户端生产者发送数据失败问题处理#2
c++·kafka