题目
623.
在二叉树中增加一行
给定一个二叉树的根 root
和两个整数 val
和
depth
,在给定的深度 depth
处添加一个值为
val
的节点行。
注意,根节点 root
位于深度 1
。
加法规则如下:
给定整数 depth
,对于深度为 depth - 1
的每个非空树节点 cur
,创建两个值为 val
的树节点作为 cur
的左子树根和右子树根。
cur
原来的左子树应该是新的左子树根的左子树。
cur
原来的右子树应该是新的右子树根的右子树。
如果 depth == 1
意味着 depth - 1
根本没有深度,那么创建一个树节点,值 val
作为整个原始树的新根,而原始树就是新根的左子树。
示例 1:
输入: root = [4,2,6,3,1,5], val = 1, depth = 2
输出: [4,1,1,2,null,null,6,3,1,5]
示例 2:
输入: 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 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 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 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 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 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 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 查看更多题解