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

    struct Node { int val;

    Node *left;

    Node *right;

    Node *next;

    }

    填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

    初始状态下,所有 next 指针都被设置为 NULL。

    填充每个节点的下一个右侧节点指针【DFS】【BFS】 - 图1

    方法1:广度优先搜索, 得到每一层所有节点,然后依次从前指向后。

    1. /*
    2. // Definition for a Node.
    3. class Node {
    4. public:
    5. int val;
    6. Node* left;
    7. Node* right;
    8. Node* next;
    9. Node() : val(0), left(NULL), right(NULL), next(NULL) {}
    10. Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
    11. Node(int _val, Node* _left, Node* _right, Node* _next)
    12. : val(_val), left(_left), right(_right), next(_next) {}
    13. };
    14. */
    15. class Solution {
    16. public:
    17. // BFS: 遍历每一层完美二叉树结点放到vector中,然后将前一个结点指向后一个。
    18. void bfs(Node * node)
    19. {
    20. queue<Node *> Q;
    21. Q.push(node->left);
    22. Q.push(node->right);
    23. while(!Q.empty())
    24. {
    25. int n = Q.size();
    26. Node * firstNode = Q.front();
    27. Q.pop();
    28. if (firstNode->left) Q.push(firstNode->left);
    29. if (firstNode->right) Q.push(firstNode->right);
    30. for(int i=1; i<n; ++i)
    31. {
    32. Node * secondNode = Q.front();
    33. Q.pop();
    34. firstNode->next = secondNode;
    35. firstNode = secondNode;
    36. if (secondNode->left) Q.push(secondNode->left);
    37. if (secondNode->right) Q.push(secondNode->right);
    38. }
    39. }
    40. }
    41. Node* connect(Node* root)
    42. {
    43. if (!root || (!root->left && !root->right))
    44. return root;
    45. bfs(root);
    46. return root;
    47. }
    48. }

    方法2:DFS深度优先搜索

    1. // DFS
    2. void dfs(Node * node)
    3. {
    4. // 达到叶子节点
    5. if (!node->left && !node->right)
    6. return;
    7. Node * child_left = node->left;
    8. Node * child_right = node->right;
    9. // 将以node为根结点的左子树与右子树对应结点都连上。
    10. while(child_left != nullptr)
    11. {
    12. child_left->next = child_right;
    13. child_left = child_left->right;
    14. child_right = child_right->left;
    15. }
    16. // node->left为根节点的完美二叉树执行相同的操作;
    17. dfs(node->left);
    18. // node->right为根节点的完美二叉树执行相同的操作。
    19. dfs(node->right);
    20. }
    21. Node* connect(Node* root)
    22. {
    23. if (!root) return root;
    24. dfs(root);
    25. return root;
    26. }

    引申:如果二叉树不是完美二叉树呢?是任意二叉树呢?上述的代码能够还适用?
    欢迎交流,批评指正!