题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

这道题可以看做是 BM24中序遍历(迭代法)的变体
其实仔细想想,用迭代反而能更容易得写出来

迭代法求解

public TreeNode Convert(TreeNode pRootOfTree) {
        if (pRootOfTree==null) return null;
        TreeNode hair = new TreeNode();
        // 免去 head == null 的判断
        TreeNode tail = hair;
        // 中序遍历(迭代)
        Deque stack = new LinkedList();
        TreeNode curr = pRootOfTree;
        while (curr!=null || !stack.isEmpty()) {
            while (curr!=null) {
                stack.offerLast(curr);
                curr = curr.left;
            }
            curr = stack.pollLast();
            tail.right = curr;
            curr.left = tail;
            tail = tail.right;
            curr = curr.right;
        }
        // 卸磨杀驴
        TreeNode head = hair.right;
        hair.right = null;
        head.left = null;
        return head;
    }

递归法求解

当然,用递归也不是写不出来,就是因为 Java 因为没有引用变量
所以必须带一个全局变量,记录当前双向列表的尾部位置

// 全局变量
    private TreeNode tail = null;
    public TreeNode Convert(TreeNode pRootOfTree) {
        if (pRootOfTree==null) return null;
        TreeNode hair = new TreeNode();
        tail = hair;
        dfs(pRootOfTree);
        TreeNode head = hair.right;
        hair.right = null;
        head.left = null;
        return head;
    }

    private void dfs(TreeNode root) {
        if (root.left==null && root.right==null) {
            tail.right = root;
            root.left = tail;
            // tail 作为局部变量,其修改是不会带到其他函数里的!!
            tail = tail.right;
            return;
        }
        if (root.left!=null) {
            dfs(root.left);
        }
        tail.right = root;
        root.left = tail;
        tail = tail.right;
        if (root.right!=null) {
            dfs(root.right);
        }
    }

如果对迭代法的辅助栈的空间忽略不计(因为Deque的实现用的 LinkedList,没有额外创建新的对象,所以辅助栈确实可以忽略不计)
那么两种方法的空间复杂度都是 O(1),时间复杂度都是 O(N)
但是,用迭代法,思路更加清晰,不容易出错,还不需要开全局变量
所以对于这道题,明显是迭代法更胜一筹

全部评论

相关推荐

💼公司岗位 tx客户端岗本人背景中九硕,cpp选手。当时在牛子上看cpp选手找不到后端岗实习,遂投了腾子的客户端想练练手。🕐面试过程投递之后很快约面了,一面面试官比较和蔼问的也是正常八股加项目的模式。然后约了二面,二面面试官应该是入职后的leader,这轮面试就离谱了,一开始问了一些八股(感觉那面试官也不怎么懂技术像是照着书上写好的问题问一样),后面离谱的来了,直接疯狂压力测试(你为什么觉得你能xxx,你能不能接受xxx)。当时因为对tx还有滤镜,把自己当作一个牛马的姿态来回答这些问题。面完之后面试官可能觉得我是一个合格的牛马,他加了我微信,问我什么时候能去实习,我说六月初,他说有点晚了,然后考虑了一天还是给我过了面试,然后3面和hr面就也是正常流程了。🐶事件起因5月末的时候导师临时给安排了一个项目,于是我就去微信问那个leader,能不能推迟到6月24入职,如果不能我可以主动放弃offer,他当时犹豫再三还是同意了(现在回想起来可能是当时还没有备胎)。就在昨天他又问我什么时候入职,然后我说24号,他说有点晚叫我看看系统上还有没有其它入职时间,因为我还没在系统上填入职信息(在牛子上看到说只有快入职了,才会有人审核,遂想端午节后再填),查看不了可申请入职的时间。和他说了原因后,这下给他抓到把柄了,直接来一句"你对这次实习并不重视,确实没什么必要了"  😅。感觉应该是找到备胎硬气了,就想把我踹走。不过爷也不想去了,客户端前景本来就不太好,这个leader也是个pua怪加压力怪,反正也是双向选择。最后再给大家一个建议,在面试过程中就感觉不舒服的组,一定不要去了,去了也只会更难受。 #不给转正的实习,你还去吗#  #找实习多的是你不知道的事#
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务