1. 程式人生 > >Leetcode 623.在二叉樹中增加一行

Leetcode 623.在二叉樹中增加一行

回來 lee add 存在 return tco 位置 ret 連接

在二叉樹中增加一行

給定一個二叉樹,根節點為第1層,深度為 1。在其第 d 層追加一行值為 v 的節點。

添加規則:給定一個深度值 d (正整數),針對深度為 d-1 層的每一非空節點 N,為 N 創建兩個值為 v 的左子樹和右子樹。

將 N 原先的左子樹,連接為新節點 v 的左子樹;將 N 原先的右子樹,連接為新節點 v 的右子樹。

如果 d 的值為 1,深度 d - 1 不存在,則創建一個新的根節點 v,原先的整棵樹將作為 v 的左子樹。

技術分享圖片

示例 2:

技術分享圖片

註意:

  1. 輸入的深度值 d 的範圍是:[1,二叉樹最大深度 + 1]。
  2. 輸入的二叉樹至少有一個節點。

思路

思路:分3種情況:

(1)插入到根節點位置:d=1

(2)插入到第二行:d=2

(3)插入到第二行之後:遞歸,每次分解成更小的樹,即每次叠代為原樹的left或right子樹,那麽插入的層數就也減小一層(d->d-1,只是數值上相對減小一),直到插入的層數減小到2,1 時會遞歸回來了,

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
8 * } 9 */ 10 class Solution { 11 public TreeNode addOneRow(TreeNode root, int v, int d) { 12 if(root == null) 13 return null; 14 //如果插到根節點位置 15 if(d==1){ 16 TreeNode newleft=new TreeNode(v); 17 newleft.left = root; 18 root = newleft;
19 }else if(d==2){ //如果插入到根節點下面,即第二行 20 TreeNode newleft = new TreeNode(v); 21 TreeNode newright = new TreeNode(v); 22 newleft.left = root.left; 23 newright.right = root.right; 24 root.left = newleft; 25 root.right = newright; 26 27 }else{ //如果插入到第二行之後 28 //遞歸,縮小範圍(取子樹root.left,root.right),相當於插入的深度減少一層(d-1) 29 addOneRow(root.left,v,d-1); 30 addOneRow(root.right,v,d-1); 31 32 } 33 return root; 34 35 } 36 }

Leetcode 623.在二叉樹中增加一行