解题思路:
首先是BFS的思路,将root放入队列中,逐层遍历,当下一层就是目标层时,取出当前层的所有元素,并加上新的左右节点,同时与下一层相连,代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int val, int depth) {
if(depth == 1) {
TreeNode *node = new TreeNode(val);
node->left = root;
return node;
}
queue<TreeNode*> q;
q.emplace(root);
int cur = 1;
while(!q.empty()) {
int n = q.size();
for(int i = 0; i < n; i ++) {
TreeNode* temp = q.front();
if(cur + 1== depth) {
TreeNode* l = new TreeNode(val);
TreeNode* r = new TreeNode(val);
l->left = temp->left;
r->right = temp->right;
temp->left = l;
temp->right = r;
} else {
if(temp->left != nullptr) {
q.emplace(temp->left);
}
if(temp->right != nullptr) {
q.emplace(temp->right);
}
}
q.pop();
}
if(cur + 1 == depth) {
break;
}
cur ++;
}
return root;
}
};
BFS的思路实现起来略显繁琐,相比之下,DFS就简洁的多,但是理解稍微有些困难,对于每次处理情况,只在于当左右两节点,如果满足深度,那么就创建新节点,然后连接左节点或者右节点,是左是右可以借助深度来判断,深度为1则左,0位右,这样可以减少大量不必要操作,代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int val, int depth) {
if(depth == 0 || depth == 1) {
TreeNode* node = new TreeNode(val);
if(depth == 1) node->left = root;
else node->right = root;
return node;
}
if(root != nullptr && depth > 1) {
root->left = addOneRow(root->left, val, depth > 2 ? depth - 1 : 1);
root->right = addOneRow(root->right, val, depth > 2 ? depth - 1 : 0);
}
return root;
}
};