多种方法解决leetcode经典题目-LCR 155. 将二叉搜索树转化为排序的双向链表, 同时弄透引用变更带来的bug

这篇具有很好参考价值的文章主要介绍了多种方法解决leetcode经典题目-LCR 155. 将二叉搜索树转化为排序的双向链表, 同时弄透引用变更带来的bug。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 描述

多种方法解决leetcode经典题目-LCR 155. 将二叉搜索树转化为排序的双向链表, 同时弄透引用变更带来的bug,数据结构,leetcode,链表,bug

2 解法一: 使用list列表粗出中序遍历的结果,然后再依次处理list中的元素并且双向链接

public Node treeToDoublyList2(Node root) {
        if(root==null)return root;
        Node dummy=new Node(-10000);

        List<Node>ans=new ArrayList<>();

        dfs2(root,ans);
        Node pre=ans.get(0);
        dummy.right=pre;

        for(int i=1;i<ans.size();i++){
            Node cur=ans.get(i);
            pre.right=cur;
            cur.left=pre;
            pre=cur;
        }
        dummy.right.left=pre;
        pre.right=dummy.right;
        return dummy.right;
    }
     void dfs2(Node root, List<Node>ans){
        if(root==null){
            return;
        }
        dfs2(root.left,ans);
        ans.add(root);
        dfs2(root.right,ans);
    }

3 解法二:使用一个全局变量作为前驱节点,同时使用一个虚拟头节点指向这个前驱,在使用dfs的时候进行双向链接,然后通过dummy虚拟头节点完成链表循环

	Node pre;
    public Node treeToDoublyList(Node root) {
        if(root==null)return root;
        Node dummy=new Node(-10000);
        pre=dummy;
        dfs(root);
        pre.right=dummy.right;
        dummy.right.left=pre;
        return dummy.right;
    }

    void dfs(Node root){
        if(root==null){
            return;
        }
        dfs(root.left);
        pre.right=root;
        root.left=pre;
        pre=root;
        dfs(root.right);
    }

4 解法三:通过引用传递

4.1 版本一:数组引用传递(执行无误)

    public Node treeToDoublyList(Node root) {
        if(root==null)return root;
        Node dummy=new Node(-10000);
        Node prev[]=new Node[1];
        prev[0]=new Node(100001);
        dummy=prev[0];
        dfs4(root,prev);
        prev[0].right=dummy.right;
        dummy.right.left=prev[0];
        return dummy.right;
    }
    void dfs4(Node root,Node[] prev){
        if(root==null){
            return;
        }
        dfs4(root.left,prev);
        prev[0].right=root;
        root.left=prev[0];
        prev[0]=root;
        dfs4(root.right,prev);
    }

4.2 版本二:通过变量引用传递(但是执行起来有问题)


    public Node treeToDoublyList(Node root) {
        if(root==null)return root;
        Node dummy=new Node(-10000);
        Node pre=dummy;
        dfs(root);
        pre.right=dummy.right;
        dummy.right.left=pre;
        return dummy.right;
    }

    void dfs3(Node root,Node pre){
        if(root==null){
            return;
        }
        dfs3(root.left,pre);
        pre.right=root;
        root.left=pre;
        pre=root;
        dfs3(root.right,pre);
    }

4.3 比较一下版本1和2,2中哪里出错了,为什么错了?

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

代码中的错误主要在 dfs3 方法中,pre 节点作为参数传递,但在递归调用中并没有更新 pre 的值。这会导致链表构建不正确。要修复这个问题,你需要在 dfs3 方法中更新 pre 的值。下面是修正后的 dfs3 方法:

void dfs3(Node root,Node[] pre){
    if(root==null){
        return;
    }
    dfs3(root.left,pre);
    pre[0].right=root;
    root.left=pre[0];
    pre[0]=root;
    dfs3(root.right,pre);
}

调用 dfs3 方法时,你需要传递一个 Node 类型数组作为 pre 参数,例如:

Node[] pre = new Node[1];
pre[0] = dummy;
dfs3(root, pre);

这样,pre 数组中的元素会在 dfs3 方法中被正确更新,从而可以构建正确的双向链表。

4.4 这里的Node pre是作为值传递的嘛?你改为传递长度为1的Node数组,就变成了引用传递?

在Java中,对象的引用是通过值传递的。这意味着当你将一个对象作为参数传递给一个方法时,你实际上是将对象引用的副本传递给了方法。如果你在方法内部修改引用所指向的对象的状态,这个修改会反映到方法外部。但是,如果你尝试直接修改引用本身(例如,使其指向一个新的对象),这个修改不会影响到方法外部的引用。

在你的代码中,Node pre 是一个对象引用,当你将其作为参数传递给 dfs3 方法时,你传递的是引用的副本。在 dfs3 方法内部,你可以修改 pre 引用所指向的 Node 对象的状态,但是如果你尝试直接修改 pre 引用本身(例如,pre = new Node(…), pre = root),这个修改不会影响到方法外部的 pre 引用。

为了在 dfs3 方法内部更新外部的 pre 引用,你可以使用一个 Node 类型的数组,如我之前所示。数组在Java中是一个对象,当你将数组作为参数传递给一个方法时,你传递的是数组对象引用的副本。你可以在方法内部修改数组内容,这些修改会反映到方法外部。因此,你可以使用一个数组来包装 pre 引用,然后在 dfs3 方法内部更新数组的内容,这样就能够实现在方法调用后更新外部的 pre 引用。文章来源地址https://www.toymoban.com/news/detail-738156.html

到了这里,关于多种方法解决leetcode经典题目-LCR 155. 将二叉搜索树转化为排序的双向链表, 同时弄透引用变更带来的bug的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构】回溯算法公式化解题 leetcode经典题目带刷:全排列、组合、子集

    一、什么是回溯算法 回溯算法(Backtracking Algorithm)是一种解决 组合问题 、 排列问题 、 选择问题 等一类问题的常用算法。它通过尝试所有可能的选择来找到问题的解,当发现当前选择不符合要求时,就回溯到之前的状态,然后尝试其他的选择。 1、基本思想: 从问题的起

    2024年02月11日
    浏览(45)
  • Java LeetCode篇-深入了解二叉树的经典解法(多种方式实现:构造二叉树)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍     文章目录         1.0 从前序与中序遍历序列来构造二叉树         1.1 实现从前序与中序遍历序列来构造二叉树思路            1.2 代码实现从前序与中序遍历序列来构造二叉树         2.0 从中序

    2024年02月05日
    浏览(76)
  • leetcode 1382. 将二叉搜索树变平衡

           本题分为两步,先用中序遍历将二叉搜索树转化为排序数组,再通过排序数组构建一个平衡二叉树。 代码如下:          本题的这两个步骤可以当作模板背下来。

    2024年02月09日
    浏览(36)
  • 【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人

    《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌ 更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍 感谢小伙伴 们点赞、关注! class   Solution :      def   findContentChildren ( self ,  g :  List [ int ],  s

    2024年02月04日
    浏览(55)
  • 小白水平理解面试经典题目LeetCode 121 Best Time to Buy and Sell Stock

    你好,2024年的第一个月,又是秋风萧瑟天气凉,草木摇落露为霜。.。。在这个特殊的时代,作为我们普通的一个打工人,我们用这道题,开启对这个不符合经济增长规律的股市反抗一把。 有这样一个数组 prices ,其中 prices[i] 是给定股票在 i th 天的价格。 我希望通过选择某

    2024年01月22日
    浏览(43)
  • leetcode 155.最小栈

    🌟 leetcode链接:https://leetcode.cn/problems/min-stack/description/ 思路: 准备两个栈,一个存放数据的栈,一个最小栈(依次存放最小值)。存放数组的栈 push 、 top 、 pop 都是常规操作,唯一不同的是 getMin ,当每次 push 的时候检查一下当前 push 的数据是否比最小栈的栈顶元素数据小

    2024年02月11日
    浏览(36)
  • 【LeetCode: 155. 最小栈 + 栈 + 数据结构设计】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月22日
    浏览(67)
  • 【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值

    《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌ 更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍 感谢小伙伴 们点赞、关注! class   Solution :      def   mySqrt ( self ,  x :   int )   -   int :       

    2024年02月04日
    浏览(65)
  • 怎样将二个路由进行桥接的方法

    装电脑时发现网线不够长,于是想到我还有个坏路由器(WAN口坏了)就想到了做一个桥接。我在想是不是有人也想这样做但是不知道方法,那么下面我就把操作的步骤分享一下,用的到的朋友尽情抱走,步骤如下: 这里我的拨号路由器叫A,另一个用来做桥接的就B。 1、先拿

    2024年02月07日
    浏览(28)
  • 【Leetcode】155. 最小栈、JZ31 栈的压入、弹出序列

     作者:小卢   专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》 155. 最小栈 题目描述; 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化

    2024年02月13日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包