给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
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深度优先搜索
// DFS
void 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;
}
引申:如果二叉树不是完美二叉树呢?是任意二叉树呢?上述的代码能够还适用?
欢迎交流,批评指正!