树
深度优先搜索
广度优先搜索
二叉树
题目描述
给定一个二叉树的根 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, 104 ]
范围内
树的深度在 [1, 104 ]
范围内
-100 <= Node.val <= 100
-105 <= val <= 105
1 <= depth <= the depth of tree + 1
解法
方法一:DFS
Python3 Java C++ Go TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution :
def addOneRow (
self , root : Optional [ TreeNode ], val : int , depth : int
) -> Optional [ TreeNode ]:
def dfs ( root , d ):
if root is None :
return
if d == depth - 1 :
root . left = TreeNode ( val , root . left , None )
root . right = TreeNode ( val , None , root . right )
return
dfs ( root . left , d + 1 )
dfs ( root . right , d + 1 )
if depth == 1 :
return TreeNode ( val , root )
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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int val ;
private int depth ;
public TreeNode addOneRow ( TreeNode root , int val , int depth ) {
if ( depth == 1 ) {
return new TreeNode ( val , root , null );
}
this . val = val ;
this . depth = depth ;
dfs ( root , 1 );
return root ;
}
private void dfs ( TreeNode root , int d ) {
if ( root == null ) {
return ;
}
if ( d == depth - 1 ) {
TreeNode l = new TreeNode ( val , root . left , null );
TreeNode r = new TreeNode ( val , null , root . right );
root . left = l ;
root . right = r ;
return ;
}
dfs ( root . left , d + 1 );
dfs ( root . right , d + 1 );
}
}
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 /**
* 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 :
int val ;
int depth ;
TreeNode * addOneRow ( TreeNode * root , int val , int depth ) {
if ( depth == 1 ) return new TreeNode ( val , root , nullptr );
this -> val = val ;
this -> depth = depth ;
dfs ( root , 1 );
return root ;
}
void dfs ( TreeNode * root , int d ) {
if ( ! root ) return ;
if ( d == depth - 1 ) {
auto l = new TreeNode ( val , root -> left , nullptr );
auto r = new TreeNode ( val , nullptr , root -> right );
root -> left = l ;
root -> right = r ;
return ;
}
dfs ( root -> left , d + 1 );
dfs ( root -> right , d + 1 );
}
};
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 /**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func addOneRow ( root * TreeNode , val int , depth int ) * TreeNode {
if depth == 1 {
return & TreeNode { Val : val , Left : root }
}
var dfs func ( root * TreeNode , d int )
dfs = func ( root * TreeNode , d int ) {
if root == nil {
return
}
if d == depth - 1 {
l , r := & TreeNode { Val : val , Left : root . Left }, & TreeNode { Val : val , Right : root . Right }
root . Left , root . Right = l , r
return
}
dfs ( root . Left , d + 1 )
dfs ( root . Right , d + 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
21
22
23
24
25
26
27
28
29
30
31
32
33 /**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function addOneRow ( root : TreeNode | null , val : number , depth : number ) : TreeNode | null {
function dfs ( root , d ) {
if ( ! root ) {
return ;
}
if ( d == depth - 1 ) {
root . left = new TreeNode ( val , root . left , null );
root . right = new TreeNode ( val , null , root . right );
return ;
}
dfs ( root . left , d + 1 );
dfs ( root . right , d + 1 );
}
if ( depth == 1 ) {
return new TreeNode ( val , root );
}
dfs ( root , 1 );
return root ;
}
方法二:BFS
Python3 Java C++ Go TypeScript
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 # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution :
def addOneRow (
self , root : Optional [ TreeNode ], val : int , depth : int
) -> Optional [ TreeNode ]:
if depth == 1 :
return TreeNode ( val , root )
q = deque ([ root ])
i = 0
while q :
i += 1
for _ in range ( len ( q )):
node = q . popleft ()
if node . left :
q . append ( node . left )
if node . right :
q . append ( node . right )
if i == depth - 1 :
node . left = TreeNode ( val , node . left , None )
node . right = TreeNode ( val , None , node . 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode addOneRow ( TreeNode root , int val , int depth ) {
if ( depth == 1 ) {
return new TreeNode ( val , root , null );
}
Deque < TreeNode > q = new ArrayDeque <> ();
q . offer ( root );
int i = 0 ;
while ( ! q . isEmpty ()) {
++ i ;
for ( int k = q . size (); k > 0 ; -- k ) {
TreeNode node = q . pollFirst ();
if ( node . left != null ) {
q . offer ( node . left );
}
if ( node . right != null ) {
q . offer ( node . right );
}
if ( i == depth - 1 ) {
node . left = new TreeNode ( val , node . left , null );
node . right = new TreeNode ( val , null , node . 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
25
26
27
28
29
30
31
32
33 /**
* 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 ) return new TreeNode ( val , root , nullptr );
queue < TreeNode *> q {{ root }};
int i = 0 ;
while ( ! q . empty ()) {
++ i ;
for ( int k = q . size (); k ; -- k ) {
TreeNode * node = q . front ();
q . pop ();
if ( node -> left ) q . push ( node -> left );
if ( node -> right ) q . push ( node -> right );
if ( i == depth - 1 ) {
node -> left = new TreeNode ( val , node -> left , nullptr );
node -> right = new TreeNode ( val , nullptr , node -> 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
25
26
27
28
29
30
31
32
33 /**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func addOneRow ( root * TreeNode , val int , depth int ) * TreeNode {
if depth == 1 {
return & TreeNode { val , root , nil }
}
q := [] * TreeNode { root }
i := 0
for len ( q ) > 0 {
i ++
for k := len ( q ); k > 0 ; k -- {
node := q [ 0 ]
q = q [ 1 :]
if node . Left != nil {
q = append ( q , node . Left )
}
if node . Right != nil {
q = append ( q , node . Right )
}
if i == depth - 1 {
node . Left = & TreeNode { val , node . Left , nil }
node . Right = & TreeNode { val , nil , node . 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
25
26
27
28
29
30
31
32
33
34 /**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function addOneRow ( root : TreeNode | null , val : number , depth : number ) : TreeNode | null {
if ( depth === 1 ) {
return new TreeNode ( val , root );
}
const queue = [ root ];
for ( let i = 1 ; i < depth - 1 ; i ++ ) {
const n = queue . length ;
for ( let j = 0 ; j < n ; j ++ ) {
const { left , right } = queue . shift ();
left && queue . push ( left );
right && queue . push ( right );
}
}
for ( const node of queue ) {
node . left = new TreeNode ( val , node . left );
node . right = new TreeNode ( val , null , node . right );
}
return root ;
}