題目
算法與思路
-
本題的思路在題目中已經爲我們全部說明了,下面再列一遍就可以了
-
給定一個深度值 d (正整數),針對深度爲 d-1 層的每一非空節點 N,爲 N 創建兩個值爲 v 的左子樹和右子樹。
將 N 原先的左子樹,連接爲新節點 v 的左子樹;將 N 原先的右子樹,連接爲新節點 v 的右子樹。
如果 d 的值爲 1,深度 d - 1 不存在,則創建一個新的根節點 v,原先的整棵樹將作爲 v 的左子樹。
具體的做法見代碼,對於二叉樹我們直接使用深度優先遍歷找到對應的節點,判斷節點的規則爲節點的深度,使用遞歸寫法實現。
代碼實現
package com.immunize.leetcode.addOneRow;
public class Solution {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
// 添加一行
public TreeNode addOneRow(TreeNode t, int v, int d) {
// 如果爲第一行,則直接添加樹到新節點的左孩子
if (d == 1) {
TreeNode n = new TreeNode(v);
n.left = t;
return n;
}
//
insert(v, t, 1, d);
return t;
}
// 實現插入
public void insert(int val, TreeNode node, int depth, int n) {
// 排除特殊情況
if (node == null)
return;
// 如果當前需要處理的節點的深度符合d-1
if (depth == n - 1) {
// 取出當前左孩子賦值給t
TreeNode t = node.left;
// 當前左孩子填充新的val
node.left = new TreeNode(val);
// 再把原來的左孩子t接上
node.left.left = t;
// 同理如右孩子
t = node.right;
node.right = new TreeNode(val);
node.right.right = t;
} else {
insert(val, node.left, depth + 1, n);
insert(val, node.right, depth + 1, n);
}
}
}
複雜度分析
時間複雜度:O(N):最差需要遍歷整個樹的所有節點一次,最好直接插入。
空間複雜度:O(N):相同深度的節點對應一個棧堆