Add One Row to Tree

Add One Row to Tree

题目描述:

给定一棵树的头结点,和插入行的深度depth和值value;要求在深度为depth的位置插入一行值为value的节点。

例子:

具体描述见LeetCode623

解题思路:

第一种想法是非递归的思路:我们可以通过按行遍历树的节点;然后找到需要插入节点的那一行的所有节点;然后遍历这些节点,不断增加新的节点和改变指针的指向即可。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int v, int d) {
if(d == 1){
TreeNode* res = new TreeNode(v);
res->left = root;
return res;
}//当深度为1的情况直接新增一个节点,然后将根节点连接到新节点的左子指针
queue<TreeNode*> q1;
queue<TreeNode*> q2;
q1.push(root);
while(!q1.empty() && d != 2){
while(!q1.empty()){
if (q1.front()->left){
q2.push(q1.front()->left);
}
if (q1.front()->right){
q2.push(q1.front()->right);
}
q1.pop();
}
queue<TreeNode*> tmp;
tmp = q2;
q2 = q1;
q1 = tmp;
d--;
}//以上通过两个队列找到需要插入节点的那一行
while(!q1.empty()){
TreeNode* node = q1.front();
TreeNode* left = node->left;
TreeNode* right = node->right;
TreeNode* new_left = new TreeNode(v);
TreeNode* new_right = new TreeNode(v);
node->left = new_left;
new_left->left = left;
node->right = new_right;
new_right->right = right;
q1.pop();
}//遍历这一行中的所有节点,不断增加新的节点和改变指针的指向即可
return root;
}
};

递归思路:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int v, int d) {
if(d == 1){
TreeNode* res = new TreeNode(v);
res->left = root;
return res;
}
TreeNode* res = helper(root, v, d);
return res;
}
TreeNode* helper(TreeNode* root, int value, int depth){
if (!root) return NULL;
if (depth == 2){
TreeNode* new_left = new TreeNode(value);
TreeNode* new_right = new TreeNode(value);
TreeNode* left = root->left;
TreeNode* right = root->right;
root->left = new_left;
new_left->left = left;
root->right = new_right;
new_right->right = right;
return root;
}//如果深度是2,直接增加节点然后改变指针指向
else{
root->left = helper(root->left, value, depth - 1);
root->right = helper(root->right, value, depth - 1);
//如果是深度是非目标行,继续往下一层遍历,记得记录指针的指向和深度的改变
return root;
}
}
};