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

这篇具有很好参考价值的文章主要介绍了剑指 Offer 36. 二叉搜索树与双向链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。

对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

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

示例 1:
输入:root = [4,2,5,1,3]
剑指 Offer 36. 二叉搜索树与双向链表,剑指Offer,链表,数据结构
输出:[1,2,3,4,5]

解释:下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。
剑指 Offer 36. 二叉搜索树与双向链表,剑指Offer,链表,数据结构

示例 2:
输入:root = [2,1,3]
输出:[1,2,3]

示例 3:
输入:root = []
输出:[]
解释:输入是空树,所以输出也是空链表。

示例 4:
输入:root = [1]
输出:[1]

提示:
-1000 <= Node.val <= 1000
Node.left.val < Node.val < Node.right.val
Node.val 的所有值都是独一无二的
0 <= Number of Nodes <= 2000


思路

二叉搜索树:二叉树,且根节点比所有左子树的值要大,根节点比所有右子树的值要小
左右子树也准从这个准则

剑指 Offer 36. 二叉搜索树与双向链表,剑指Offer,链表,数据结构

剑指 Offer 36. 二叉搜索树与双向链表,剑指Offer,链表,数据结构
可以整体把树分为三部分:根节点、左子树、右子树

然后将:
根节点,与左子树最大的节点链接起来
根节点,与右子树最小的节点链接起来

递归

就是一个中序遍历

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val,Node _left,Node _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {

    Node pre;//指针用于保存中序遍历的前一个节点
    Node head;//指针用于记录排序链表的头节点

    public Node treeToDoublyList(Node root) {
        //边界条件
        if(root == null) return null;

        inOrder(root);

        //组成循环链表
        head.left = pre;
        pre.right = head;

        return head;
    }

    //中序遍历
    public void inOrder(Node root){
        //边界条件
        if(root == null) return;

        //中序遍历左子树
        inOrder(root.left);

        if(pre != null){
        	//相对于左子树的最右节点,的右指针,指向root
            pre.right = root;
        }else{
            //找出头结点
            head = root;
        }
        
        //相当于根节点的左指针,指向左子树的最右节点(加上前面那个,形成双向链表)
        root.left = pre;
		
		//当根节点与左子树的关系确定完,则,此时,pre就成了root
        pre = root;
		
		
        System.out.println(root.val);

        //中序遍历右子树
        inOrder(root.right);
    }
}

代码中,只做了 左子树与根节点产生双向链接的操作,而没有做根节点与右子树产生双向链表的操作

这是因为,当中序遍历右子树的时候,执行代码就会将根节点与右子树的最小节点产生链接

如果代码中明确写:根与左子树、根与右子树都产生双向链接,则在中序遍历右子树的时候,就会造成重复文章来源地址https://www.toymoban.com/news/detail-789531.html

到了这里,关于剑指 Offer 36. 二叉搜索树与双向链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指 Offer 34. 二叉树中和为某一值的路径 / LeetCode 113. 路径总和 II(深度优先搜索)

    链接:剑指 Offer 34. 二叉树中和为某一值的路径;LeetCode 113. 路径总和 II 难度:中等 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root = [5,4,8,11,null,1

    2024年02月03日
    浏览(38)
  • 【Leetcode】二叉树的最近公共祖先,二叉搜索树转换成排好序的双向链表,前序遍历与中序遍历构造二叉树

    二叉树的最近公共祖先  观察上图,节点1和节点4的最近公共祖先是3,这是不是很像相交链表的问题,关于相交链表,曾经我在另一篇文章里写到过,读者可以参考:反转链表 合并链表 相交链表 但是要转换成相交链表,就要从后向前遍历,如果节点中还存在一个指针,指向

    2024年02月14日
    浏览(36)
  • 剑指offer刷题笔记-链表

    少年何妨梦摘星 敢挽桑弓射玉衡 解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。很多面试官喜欢出与链表相关的问题,就是想通过指针操作来考察应聘者的编码功底。 题目链接 来自于 AcWing 、 Leetcode (LCR) 目录  从尾到头打印链表 题目

    2024年02月21日
    浏览(35)
  • 剑指 Offer 24. 反转链表

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸剑指 Offer  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸

    2024年02月06日
    浏览(41)
  • 多种方法解决leetcode经典题目-LCR 155. 将二叉搜索树转化为排序的双向链表, 同时弄透引用变更带来的bug

    这段代码实际上是一个常见的算法题目的解法,目标是将一个二叉搜索树转换为一个排序的双向链表。整个过程是通过中序遍历来实现的,遍历过程中修改节点的左右指针来构建双向链表。代码中使用了一个额外的节点 dummy 来帮助构建双向链表,并使用 pre 节点来保存前一个

    2024年02月06日
    浏览(43)
  • 剑指 Offer 06. 从尾到头打印链表

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸剑指 Offer   📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同

    2024年02月08日
    浏览(42)
  • 《剑指offer》——合并两个排序的链表

    本期给大家带来的是  合并两个排序的链表 这道题的讲解!!!  接下来,我们还是先从题干的内容入手,先分析一波题目,在进行画图思考操作。 💨  题目如下: 示例1 输入:{1,3,5},{2,4,6} 返回值:{1,2,3,4,5,6} 示例2 输入:{},{} 返回值:{} 示例3 输入:{-1,2,4},{1,3,4} 返回值:

    2023年04月13日
    浏览(35)
  • (链表) 剑指 Offer 24. 反转链表 ——【Leetcode每日一题】

    难度:简单 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入 : 1-2-3-4-5-NULL 输出 : 5-4-3-2-1-NULL 限制 : 0 = 节点个数 = 5000 注意:本题与 206. 反转链表 相同。 💡思路: 法一:递归 可以将本问题分解成子问题: 1 - (剩余部分的反转)

    2024年02月15日
    浏览(47)
  • 剑指offer27.二叉树的镜像

    这道题很简单,写了十多分钟就写出来了,一看题目就知道这道题肯定要用递归。先交换左孩子和右孩子,再用递归交换左孩子的左孩子和右孩子,交换右孩子的左孩子和右孩子,其中做一下空判断就行。以下是我的代码: 看了一下题解大多数用的递归,还有用辅助栈的。

    2024年02月12日
    浏览(45)
  • 剑指 Offer 35. 复杂链表的复制

    请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 示例 1: 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]] 示例 2: 输入:head = [[1

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包