leetcode623_在二叉樹中增加一行
阿新 • • 發佈:2018-12-10
給定一個二叉樹,根節點為第1層,深度為 1。在其第 d 層追加一行值為 v 的節點。
新增規則:給定一個深度值 d (正整數),針對深度為 d-1 層的每一非空節點 N,為 N 建立兩個值為 v 的左子樹和右子樹。
將 N 原先的左子樹,連線為新節點 v 的左子樹;將 N 原先的右子樹,連線為新節點 v 的右子樹。
如果 d 的值為 1,深度 d - 1 不存在,則建立一個新的根節點 v,原先的整棵樹將作為 v 的左子樹。
示例 1:
輸入:
二叉樹如下所示:
4
/ \
2 6
/ \ /
3 1 5
v = 1
d = 2
輸出:
4
/ \
1 1
/ \
2 6
/ \ /
3 1 5
示例 2:
輸入:
二叉樹如下所示:
4
/
2
/ \
3 1
v = 1
d = 3
輸出:
4
/
2
/ \
1 1
/ \
3 1
注意:
輸入的深度值 d 的範圍是:[1,二叉樹最大深度 + 1]。
輸入的二叉樹至少有一個節點。
思路:
利用bfs的思想 利用佇列儲存第d-1行的節點 再進行插入
if (d == 1) {
TreeNode newroot = new TreeNode(v);
newroot.left = root;
return newroot;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
for (int i = 0; i < d-2; i++) {
int size = queue.size();
for (int j = 0; j < size; j++) {
TreeNode t = queue.poll();
if (t.left != null) queue.add(t.left);
if (t.right != null) queue.add(t.right);
}
}
//此時佇列中儲存d-1行的節點
while (!queue.isEmpty()) {
TreeNode t = queue.poll();
//處理左孩子
TreeNode tmp = t.left;
t.left = new TreeNode(v); //將新的節點v加入
t.left.left = tmp;
//處理右孩子
tmp = t.right;
t.right = new TreeNode(v); //將新的節點v加入
t.right.right = tmp;
}
return root;