本题其实并不算难,不过还是没有解出,但是实话实说,中间的思维力度还是有一点大的,想明白就是想明白了,想不明白就是想不明白
    最开始我是用Queue做的,虽然做出来了,也不难,但是时间复杂度是116. Populating Next Right Pointers in Each Node - 图1,不符合Follow Up里面的时间复杂度116. Populating Next Right Pointers in Each Node - 图2的条件[忽略recursive]。。
    本题其实用recursive很好解出,但是需要想明白一些事 116. Populating Next Right Pointers in Each Node - 图3如上图所示,如果需要Connect 2,3两个黄色的node,及其子树,我们需要:

    • link 2->3
    • recursive Connect 4, 5
    • recursive Connect 5, 6
    • recursive Connect 6, 7

    之后则可以完成

    • 时间复杂度:116. Populating Next Right Pointers in Each Node - 图4
    • 空间复杂度,如果忽略Stack的影响,则是:116. Populating Next Right Pointers in Each Node - 图5

    代码如下:

    1. /*
    2. // Definition for a Node.
    3. class Node {
    4. public int val;
    5. public Node left;
    6. public Node right;
    7. public Node next;
    8. public Node() {}
    9. public Node(int _val) {
    10. val = _val;
    11. }
    12. public Node(int _val, Node _left, Node _right, Node _next) {
    13. val = _val;
    14. left = _left;
    15. right = _right;
    16. next = _next;
    17. }
    18. };
    19. */
    20. class Solution {
    21. public Node connect(Node root) {
    22. if (root == null) {
    23. return root;
    24. }
    25. if (root.left != null) {
    26. connectNode(root.left, root.right);
    27. }
    28. return root;
    29. }
    30. private void connectNode(Node node1, Node node2) {
    31. node1.next = node2;
    32. if (node1.left != null) {
    33. connectNode(node1.left, node1.right);
    34. connectNode(node1.right, node2.left);
    35. connectNode(node2.left, node2.right);
    36. }
    37. }
    38. }