leetcode 每日一题 117 填充每个节点的下一个右侧节点指针 II

leetcode 每日一题 117 填充每个节点的下一个右侧节点指针 II_第1张图片
leetcode 每日一题 117 填充每个节点的下一个右侧节点指针 II_第2张图片
如果用队列层次遍历不难,直接撸代码:

public class lc117 {
    public Node connect(Node root) {
        if ( root == null ) return null;
        Node temp;
        Deque<Node> deque = new LinkedList<>();

        deque.addLast(root);
        while ( deque.size() != 0 ) {
            int size = deque.size();
            while ( size > 0 ) {
                temp = deque.pollFirst();
                if (temp.left!=null) deque.addLast(temp.left);
                if (temp.right!=null) deque.addLast(temp.right);
                if ( size > 1 ) {
                    temp.next = deque.getFirst();
                    temp = temp.next;
                } else {
                    temp.next = null;
                }
                size--;
            }
        }
        return root;
    }
}

但是题目说进阶要求是常量级额外空间,这样就不能用队列。考虑到每次对第 i 层的节点完成填充后,第 i+1 层就可以通过第 i 层来访问,这样就可以只用常数个节点来存储信息。
考虑到需要通过第 i 层的 next 层次遍历第 i+1 层,这样就需要一个节点从第 i 层第一个节点移动到最后一个节点;第 i+1 层节点 next 的填充需要一个节点保存上一个节点的信息;从第 i 层到第 i+1 层的时候需要一个节点来存储下一层的 start 节点。
遍历过程如下:
leetcode 每日一题 117 填充每个节点的下一个右侧节点指针 II_第3张图片
可以看出每次 p 层次遍历第 i 层的节点,遇见第 i+1 层的第一个节点会用 nextstart 存储当前节点,next 每次存储下一个节点的层次遍历前驱;p 一层遍历完后会将让 start 引用 nextstart 节点,并且将 next 和 nextstart 置空。

整理后代码如下:

public class lc117 {
    Node next = null, nextStart = null;//next存储第 i+1 层访问节点;nextStart存储下一层的 start 节点

    public Node connect(Node root) {
        if (root == null) return null;
        Node start = root;
        while (start != null) {
            next = null;
            nextStart = null;
            for (Node p = start; p != null; p = p.next) {
                if (p.left != null) connectOne(p.left);
                if (p.right != null) connectOne(p.right);
            }
            start = nextStart;
        }
        return root;
    }

    public void connectOne(Node node) {
        if (next != null) {
            next.next = node;
        }
        if (nextStart == null) {
            nextStart = node;
        }
        next = node;
    }
}

你可能感兴趣的:(leetcode,leetcode,算法,二叉树,数据结构,java)