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

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

    题目描述:

    给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

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

    提示:

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

    思路:

    与下一题117. 填充每个节点的下一个右侧节点指针 II都可以用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
    

    但是不符合题意, 要使用常量级额外空间

    所以我们用其他空间(O(1))的方法

    思路一: 递归

    思路二: 迭代

    代码:

    思路一:

    def connect(self, root: 'Node') -> 'Node':
            if not root:
                return 
            if root.left:
                root.left.next = root.right
                if root.next:
                    root.right.next = root.next.left
            self.connect(root.left)
            self.connect(root.right)
            return root
    

    java

    class Solution {
        public Node connect(Node root) {
            if (root == null) return null;
            if (root.left != null) {
                root.left.next = root.right;
                if (root.next != null) root.right.next = root.next.left;
            }
            connect(root.left);
            connect(root.right);
            return root;
        }
    }
    

    思路二:

    class Solution:
        def connect(self, root: 'Node') -> 'Node':
            pre = root
            while pre:
                cur = pre
                while cur:
                    if cur.left: cur.left.next = cur.right
                    if cur.right and cur.next: cur.right.next = cur.next.left
                    cur = cur.next
                pre = pre.left
            return root
    

    java

    class Solution {
        public Node connect(Node root) {
            Node pre = root;
            while (pre != null) {
                Node cur = pre;
                while (cur != null) {
                    if (cur.left != null) cur.left.next = cur.right;
                    if (cur.right != null && cur.next != null) cur.right.next = cur.next.left;
                    cur = cur.next;
                }
                pre = pre.left;
            }
            return root;
        }
    }
    
  • 相关阅读:
    第08讲树
    第11讲简单算法
    【ZOJ1004】Anagrams by Stack
    【ZOJ1649】Rescue
    第10讲并查集
    网站建设与网页制作课件
    获取鼠标的坐标
    asp.net页面的默认回车事件
    NeatUpload的安装使用
    Page methods 执行顺序
  • 原文地址:https://www.cnblogs.com/powercai/p/11116697.html
Copyright © 2011-2022 走看看