0117. Populating Next Right Pointers in Each Node II (M)

Populating Next Right Pointers in Each Node II (M)

题目

Given a binary tree

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

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Example:

Input: {"$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}

Output: {"$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}

Explanation: Given the above binary tree (Figure A), your function should populate each next pointer to point to its next right node, just like in Figure B. 

Note:

  • You may only use constant extra space.
  • Recursive approach is fine, implicit stack space does not count as extra space for this problem.

题意

对于二叉树的每一层,将当前层每一个结点的next域指向该层的右边一个结点;如果已经是当前层的最右结点,则指向null。(限制只能使用\(O(1)\)的额外空间,如果使用递归,则系统栈不计入额外空间)

思路

116. Populating Next Right Pointers in Each Node 相比,只是在满二叉树这个条件上做了变化。因此只要在先前的代码上做出修改即可。


代码实现

Java

递归

class Solution {
    public Node connect(Node root) {
        if (root == null) {
            return null;
        }

        // 寻找root的右兄弟子树中出现的第一个子结点
        Node p = root.next;
        while (p != null) {
            if (p.left != null) {
                p = p.left;
                break;
            }
            if (p.right != null) {
                p = p.right;
                break;
            }
            p = p.next;
        }

        if (root.right != null) {
            root.right.next = p;
            p = root.right;
        } 
        if (root.left != null) {
            root.left.next = p;
        }

        // 注意需要先递归右子树再递归左子树,具体原因见参考评论
        connect(root.right);
        connect(root.left);

        return root;
    }
}

层序遍历(\(O(1)\)额外空间)

// 版本1
class Solution {
    public Node connect(Node root) {
        Node head = root;

        while (head != null) {
            Node nextHead = null;		// 指向下一层的第一个结点
            Node last = null;			// 指向下一层已连接的最后一个结点
            
            // 连接下一层所有结点
            while (head != null) {
                if (head.left != null) {
                    if (nextHead == null) {
                        nextHead = head.left;
                        last = nextHead;
                    } else {
                        last.next = head.left;
                        last = last.next;
                    }
                }
                if (head.right != null) {
                    if (nextHead == null) {
                        nextHead = head.right;
                        last = nextHead;
                    } else {
                        last.next = head.right;
                        last = last.next;
                    }
                }
                head = head.next;
            }
            
            head = nextHead;
        }

        return root;
    }
}

// 版本2
class Solution {
    public Node connect(Node root) {
        Node dummy = new Node(0, null, null, null);
        Node cur = dummy;
        Node head = root;
        
        while (root != null) {
            if (root.left != null) {
                cur.next = root.left;
                cur = cur.next;
            }
            if (root.right != null) {
                cur.next = root.right;
                cur = cur.next;
            }
            root = root.next;
            if (root == null) {
                root = dummy.next;
                cur = dummy;
                dummy.next = null;
            }
        }

        return head;
    }
}

JavaScript

/**
 * @param {Node} root
 * @return {Node}
 */
var connect = function (root) {
  let p = root

  while (p) {
    let first = null
    let last = null

    while (p) {
      if (p.left && !first) {
        first = p.left
        last = p.left
      } else if (p.left) {
        last.next = p.left
        last = p.left
      }
      if (p.right && !first) {
        first = p.right
        last = p.right
      } else if (p.right) {
        last.next = p.right
        last = p.right
      }
      p = p.next
    }

    p = first
  }

  return root
}

参考

cnBlogs - Grandyang

posted @ 2020-12-06 17:03  墨云黑  阅读(93)  评论(0编辑  收藏  举报