leetcode笔记—117填充每个节点的下一个右侧节点Ⅱ

这篇博客详细介绍了如何解决LeetCode上的一个问题——填充每个节点的下一个右侧节点。作者提供了两种解决方案,一种是通过创建一个队列逐层处理节点,另一种是采用递归的方法,确保在常数空间复杂度下完成任务。博客内容包括问题描述、示例、解题思路以及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个二叉树

struct TreeLinkNode {
  TreeLinkNode *left;
  TreeLinkNode *right;
  TreeLinkNode *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

说明:

  • 你只能使用额外常数空间
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

示例:

给定二叉树,

     1
   /  \
  2    3
 / \    \
4   5    7

调用你的函数后,该二叉树变为:

     1 -> NULL
   /  \
  2 -> 3 -> NULL
 / \    \
4-> 5 -> 7 -> NULL

思路:网上找的大神的代码,但是还是有些看不懂,先记在这里。

这个题与116题的区别在于116题中的是一个完美二叉树。左右节点都存在,这个就只是一个普通的二叉树了。题目中要求使用额外的常数空间。

代码1,先记录下来,这个代码和下面最快代码的时间相同。

class Solution {
    public Node connect(Node root) {
        Node queue = root;
        Node level = new Node(0);
        while (queue != null) {
            level.next = null;
            Node current = level;
            while (queue != null) {
                if (queue.left != null) {
                    current.next = queue.left;
                    current = current.next;
                }
                if (queue.right != null) {
                    current.next = queue.right;
                    current = current.next;
                }
                queue = queue.next;
            }
            queue = level.next;
        }
        return root;
    }
}   
  代码2: 执行最快的代码

这个是leetcode中最快的代码,可以理解。这个最快的代码应该是常数级的空间。最快的代码我可以自己写出来,但是要注意黑体的部分小心写错。

 class Solution {
    public Node connect(Node root) {
        helper(root);
        return root;
    }
    
    void helper(Node node){
        if(node == null)return;
        Node next = null;
        if(node.left != null){
            if(node.right != null){
                node.left.next = node.right;
            }else{
                next = node.next;
                while(next != null){
                    if(next.left != null){
                        node.left.next = next.left;
                        break;
                    }else if(next.right != null){
                        node.left.next = next.right;
                        break;
                    }
                    next = next.next;
                }
            }
        }
        if(node.right != null){
            next = node.next;
            while(next != null){
                if(next.left != null){
                    node.right.next = next.left;
                    break;
                }else if(next.right != null){
                    node.right.next = next.right;
                    break;
                }
                next = next.next;
            }
        }
        helper(node.right);
        helper(node.left);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值