zoukankan      html  css  js  c++  java
  • [LeetCode] 117. 填充每个节点的下一个右侧节点指针 II

    题目链接 : https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/

    题目描述:

    给定一个二叉树

    struct Node {
      int val;
      Node *left;
      Node *right;
      Node *next;
    }
    

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

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

    示例:

    输入:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":null,"next":null,"right":{"$id":"6","left":null,"next":null,"right":null,"val":7},"val":3},"val":1}
    
    输出:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":{"$id":"4","left":null,"next":{"$id":"5","left":null,"next":null,"right":null,"val":7},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"6","left":null,"next":null,"right":{"$ref":"5"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"6"},"val":1}
    
    解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。
    

    提示:

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

    思路:

    上一题一样,可以用BFS做

    def connect(self, root: 'Node') -> 'Node':
            from collections import deque
            if not root: return root
            queue = deque()
            queue.appendleft(root)
            while queue:
                p = None
                n = len(queue)
                for _ in range(n):
                    tmp = queue.pop()
                    if p:
                        p.next = tmp
                        p = p.next
                    else:
                        p = tmp
                    if tmp.left:
                        queue.appendleft(tmp.left)
                    if tmp.right:
                        queue.appendleft(tmp.right)
                p.next = None 
            return root
    

    但是题目要求我们用常数空间,我们借用上一题的迭代方法!

    cur记层该层访问节点

    head记录下一层合成链表的开头.

    tail记录下一层合成链表的结尾.

    直接看代码, 就能理解了!

    代码:

    """
    # Definition for a Node.
    class Node:
        def __init__(self, val, left, right, next):
            self.val = val
            self.left = left
            self.right = right
            self.next = next
    """
    class Solution:
        def connect(self, root: 'Node') -> 'Node':
            cur = root
            head = None
            tail = None
            while cur:
                while cur:
                    if cur.left:
                        if not head:
                            head = cur.left
                            tail = cur.left
                        else:
                            tail.next = cur.left
                            tail = tail.next
                    if cur.right:
                        if not head:
                            head = cur.right
                            tail = cur.right
                        else:
                            tail.next = cur.right
                            tail = tail.next
                    cur = cur.next
                cur = head
                head = None
                tail = None
            return root
    

    java

    class Solution {
        public Node connect(Node root) {
            Node cur = root;
            Node head = null;
            Node tail = null;
            while (cur != null) {
                while (cur != null) {
                    if (cur.left != null) {
                        if (head == null) {
                            head = cur.left;
                            tail = head;
                        } else {
                            tail.next = cur.left;
                            tail = tail.next;
                        }
                    }
                    if (cur.right != null) {
                        if (head == null) {
                            head = cur.right;
                            tail = head;
                        } else {
                            tail.next = cur.right;
                            tail = tail.next;
                        }
                    }
                    cur = cur.next;
                }
                cur = head;
                head = null;
                tail = null;
            }
            return root;
        }
    }
    
  • 相关阅读:
    linux 中$ 意思
    Linux查看日志命令- more、less、tail、head命令的区别
    center os 创建用户、设置密码、修改用户、删除用户命令
    Hello world
    小程序3.6
    小程序3.5
    小程序3.4
    小程序2
    小程序
    事件冒泡
  • 原文地址:https://www.cnblogs.com/powercai/p/11128998.html
Copyright © 2011-2022 走看看