0%

『LeetCode』623 在二叉树中增加一行

题目

623. 在二叉树中增加一行

给定一个二叉树的根 root 和两个整数 valdepth ,在给定的深度 depth 处添加一个值为 val 的节点行。

注意,根节点 root 位于深度 1

加法规则如下:

  • 给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur ,创建两个值为 val 的树节点作为 cur 的左子树根和右子树根。
  • cur 原来的左子树应该是新的左子树根的左子树。
  • cur 原来的右子树应该是新的右子树根的右子树。
  • 如果 depth == 1 意味着 depth - 1 根本没有深度,那么创建一个树节点,值 val 作为整个原始树的新根,而原始树就是新根的左子树。

示例 1:

add1-tree

输入: root = [4,2,6,3,1,5], val = 1, depth = 2
输出: [4,1,1,2,null,null,6,3,1,5]

示例 2:

add2-tree

输入: root = [4,2,null,3,1], val = 1, depth = 3
输出: [4,2,null,1,1,3,null,null,1]

提示:

  • 节点数在 \([1, 10^{4}]\) 范围内
  • 树的深度在 \([1, 10^{4}]\)范围内
  • \(-100 <= Node.val <= 100\)
  • \(-10^{5} <= val <= 10^{5}\)
  • \(1 <= depth <= the depth of tree + 1\)

标签

树, 深度优先搜索, 广度优先搜索, 二叉树


题解

【在二叉树中增加一行】简单二叉树遍历

BFS

按行处理一般会先想到使用BFS, 即二叉树的层序遍历,在目标层的前一层进行插入结点操作处理即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Code language: Python
class Solution:
def addOneRow(self, root: Optional[TreeNode], val: int, depth: int) -> Optional[TreeNode]:
if depth == 1:
return TreeNode(val, left=root)
st = deque([root])
for h in count(1):
if h == depth - 1:
for cur in st:
cur.left = TreeNode(val, cur.left)
cur.right = TreeNode(val, right=cur.right)
return root
for _ in range(len(st)):
cur = st.popleft()
if cur.left:
st.append(cur.left)
if cur.right:
st.append(cur.right)
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
// Code language: Java
class Solution {
public TreeNode addOneRow(TreeNode root, int val, int depth) {
if (depth == 1) return new TreeNode(val, root, null);
Deque<TreeNode> st = new ArrayDeque<>();
st.addLast(root);
for (int h = 1; !st.isEmpty(); ++h) {
if (h == depth - 1) {
while (!st.isEmpty()) {
TreeNode cur = st.poll();
cur.left = new TreeNode(val, cur.left, null);
cur.right = new TreeNode(val, null, cur.right);
}
}
for (int i = st.size(); i > 0; --i) {
TreeNode cur = st.poll();
if (cur.left != null) st.addLast(cur.left);
if (cur.right != null) st.addLast(cur.right);
}
}
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
// Code language: C++
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int val, int depth) {
if (depth == 1) return new TreeNode(val, root, nullptr);
queue<TreeNode*> st;
st.push(root);
for (int h = 1; !st.empty(); ++h) {
if (h == depth - 1) {
while (!st.empty()) {
TreeNode* cur = st.front(); st.pop();
cur->left = new TreeNode(val, cur->left, nullptr);
cur->right = new TreeNode(val, nullptr, cur->right);
}
}
for (int i = st.size(); i > 0; --i) {
TreeNode* cur = st.front(); st.pop();
if (cur->left != nullptr) st.push(cur->left);
if (cur->right != nullptr) st.push(cur->right);
}
}
return root;
}
};
  • 时间复杂度: \(O(n)\), \(n\) 表示二叉树结点总数
  • 空间复杂度: \(O(n)\)

DFS

二叉树使用 DFS 操作也是非常常规的操作了,而且使用递归方法代码更简洁,记录每层高度即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Code language: Python
class Solution:
def addOneRow(self, root: Optional[TreeNode], val: int, depth: int) -> Optional[TreeNode]:
if depth == 1:
return TreeNode(val, left=root)

def dfs(root, h):
if root:
if h + 1 == depth:
root.left = TreeNode(val, root.left)
root.right = TreeNode(val, right=root.right)
else:
dfs(root.left, h + 1)
dfs(root.right, h + 1)

dfs(root, 1)
return root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Code language: Java
class Solution {
public TreeNode addOneRow(TreeNode root, int val, int depth) {
if (depth == 1) return new TreeNode(val, root, null);
dfs(root, 1, val, depth);
return root;
}

public void dfs(TreeNode root, int h, int val, int depth) {
if (root == null) return;
if (h + 1 == depth) {
root.left = new TreeNode(val, root.left, null);
root.right = new TreeNode(val, null, root.right);
}
else {
dfs(root.left, h + 1, val, depth);
dfs(root.right, h + 1, val, depth);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Code language: C++
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int val, int depth) {
if (depth == 1) return new TreeNode(val, root, nullptr);
function<void(TreeNode*, int)> dfs = [&val, &depth, &dfs](TreeNode* root, int h) {
if (root == nullptr) return ;
if (h + 1 == depth) {
root->left = new TreeNode(val, root->left, nullptr);
root->right = new TreeNode(val, nullptr, root->right);
}
else {
dfs(root->left, h + 1);
dfs(root->right, h +1);
}
};
dfs(root, 1);
return root;
}
};
  • 时间复杂度: \(O(n)\), \(n\) 表示二叉树结点总数
  • 空间复杂度: \(O(h)\), \(n\) 表示二叉树高度

如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客Algorithm - Github 查看更多题解

--- ♥ end ♥ ---

欢迎关注我呀~