二叉树 
      
    
      
      
      
        广度优先搜索 
      
    
      
      
      
        树 
      
    
      
      
      
        深度优先搜索 
      
    
   
  
    
      
       
     
  
  
    
      
    
    
      
       
     
  
题目描述 
给定一个二叉树的根 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 ; 
}