2021-02-20 116. 填充每個(gè)節(jié)點(diǎn)的下一個(gè)右側(cè)節(jié)點(diǎn)指針

題目地址

https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/submissions/

題目描述

給定一個(gè) 完美二叉樹 ,其所有葉子節(jié)點(diǎn)都在同一層,每個(gè)父節(jié)點(diǎn)都有兩個(gè)子節(jié)點(diǎn)。二叉樹定義如下:
struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}
填充它的每個(gè) next 指針,讓這個(gè)指針指向其下一個(gè)右側(cè)節(jié)點(diǎn)。如果找不到下一個(gè)右側(cè)節(jié)點(diǎn),則將 next 指針設(shè)置為 NULL。
初始狀態(tài)下,所有 next 指針都被設(shè)置為 NULL。

進(jìn)階:
你只能使用常量級(jí)額外空間。
使用遞歸解題也符合要求,本題中遞歸程序占用的??臻g不算做額外的空間復(fù)雜度。
 
示例:
輸入:root = [1,2,3,4,5,6,7]
輸出:[1,#,2,3,#,4,5,6,7,#]
解釋:給定二叉樹如圖 A 所示,你的函數(shù)應(yīng)該填充它的每個(gè) next 指針,以指向其下一個(gè)右側(cè)節(jié)點(diǎn),如圖 B 所示。序列化的輸出按層序遍歷排列,同一層節(jié)點(diǎn)由 next 指針連接,'#' 標(biāo)志著每一層的結(jié)束。
 
提示:
樹中節(jié)點(diǎn)的數(shù)量少于 4096
-1000 <= node.val <= 1000

思路

  1. 暴力法, 先存儲(chǔ)下每一層的最右邊節(jié)點(diǎn), 然后存儲(chǔ)層次遍歷序列, 然后在序列中設(shè)置next指向, 到最右邊節(jié)點(diǎn)設(shè)置next為空, 往下一層最右邊走
  2. 因?yàn)槭菨M二叉樹, 前序遍歷過程中設(shè)置next.

題解

/**
 * Created by zcdeng on 2021/2/20.
 */
public class TreeConnect {
    public static void main(String[] args) {
        Node root = Node.create(new int[] {1,2,3,4,5,6,7});
        Node ret = connect(root);
        System.out.println(ret.left.next.val);

        ret = connectV2(root);
        System.out.println(ret.left.next.val);
    }
    /**
     * 執(zhí)行用時(shí):0 ms, 在所有 Java 提交中擊敗了100.00%的用戶
     * 內(nèi)存消耗:39 MB, 在所有 Java 提交中擊敗了5.92%的用戶
     */
    private static Node connectV2(Node root) {
        if (root == null|| root.left == null) {
            return root;
        }
        root.left.next = root.right;
        if (root.next != null) {
            root.right.next = root.next.left;
        }
        connectV2(root.left);
        connectV2(root.right);
        return root;
    }
    /**
     * 執(zhí)行用時(shí):9 ms, 在所有 Java 提交中擊敗了7.37%的用戶
     * 內(nèi)存消耗:38.6 MB, 在所有 Java 提交中擊敗了69.71%的用戶
     */
    private static Node connect(Node root) {
        if (root == null) {
            return null;
        }

        List<Node> rights = new ArrayList<Node>();
        Node right = root;
        while (right != null) {
            rights.add(right);
            if (right.right != null) {
                right = right.right;
            } else {
                break;
            }
        }

        List<Node> queue = new ArrayList<Node>();
        queue.add(root);
        int index = 0;
        while (index < queue.size()) {
            Node current = queue.get(index++);

            if (current.left != null) {
                queue.add(current.left);
            }

            if (current.right != null) {
                queue.add(current.right);
            }
        }

        int i=0,j=0;
        while (i< rights.size() && j < queue.size() - 1) {
            Node rightNode = rights.get(i);
            Node current = queue.get(j);

            if (rightNode == current) {
                i++;
                current.next = null;
            } else {
                current.next = queue.get(j+1);
            }
            j++;
        }
        return root;
    }
}

class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }

    public static Node create(int[] arr) {
        if (arr.length < 1) {
            return null;
        }
        int index = 0;
        Node root = new Node(arr[index]);
        List<Node> queue = new ArrayList<Node>();
        queue.add(root);
        while (index < arr.length && queue.size() > 0) {
            Node tmp = queue.remove(0);
            index++;
            if (index < arr.length && arr[index] != -1) {
                tmp.left = new Node(arr[index]);
                queue.add(tmp.left);
            }
            index++;
            if (index < arr.length && arr[index] != -1) {
                tmp.right = new Node(arr[index]);
                queue.add(tmp.right);
            }
        }
        return root;
    }

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7};
        Node root = Node.create(arr);
        preOrder(root);
        System.out.println();
    }

    public static void preOrder(Node root) {
        if (root != null) {
            System.out.print(root.val + " ");
            preOrder(root.left);
            preOrder(root.right);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容