给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node { int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。

方法1:广度优先搜索, 得到每一层所有节点,然后依次从前指向后。
/*// Definition for a Node.class Node {public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(int _val, Node* _left, Node* _right, Node* _next): val(_val), left(_left), right(_right), next(_next) {}};*/class Solution {public:// BFS: 遍历每一层完美二叉树结点放到vector中,然后将前一个结点指向后一个。void bfs(Node * node){queue<Node *> Q;Q.push(node->left);Q.push(node->right);while(!Q.empty()){int n = Q.size();Node * firstNode = Q.front();Q.pop();if (firstNode->left) Q.push(firstNode->left);if (firstNode->right) Q.push(firstNode->right);for(int i=1; i<n; ++i){Node * secondNode = Q.front();Q.pop();firstNode->next = secondNode;firstNode = secondNode;if (secondNode->left) Q.push(secondNode->left);if (secondNode->right) Q.push(secondNode->right);}}}Node* connect(Node* root){if (!root || (!root->left && !root->right))return root;bfs(root);return root;}}
方法2:DFS深度优先搜索
// DFSvoid dfs(Node * node){// 达到叶子节点if (!node->left && !node->right)return;Node * child_left = node->left;Node * child_right = node->right;// 将以node为根结点的左子树与右子树对应结点都连上。while(child_left != nullptr){child_left->next = child_right;child_left = child_left->right;child_right = child_right->left;}// node->left为根节点的完美二叉树执行相同的操作;dfs(node->left);// node->right为根节点的完美二叉树执行相同的操作。dfs(node->right);}Node* connect(Node* root){if (!root) return root;dfs(root);return root;}
引申:如果二叉树不是完美二叉树呢?是任意二叉树呢?上述的代码能够还适用?
欢迎交流,批评指正!
