623 在二叉樹中增加一行
阿新 • • 發佈:2020-12-21
技術標籤:LeetCode
題目描述:
給定一個二叉樹,根節點為第1層,深度為 1。在其第 d 層追加一行值為 v 的節點。
新增規則:給定一個深度值 d (正整數),針對深度為 d-1 層的每一非空節點 N,為 N 建立兩個值為 v 的左子樹和右子樹。
將 N 原先的左子樹,連線為新節點 v 的左子樹;將 N 原先的右子樹,連線為新節點 v 的右子樹。
如果 d 的值為 1,深度 d - 1 不存在,則建立一個新的根節點 v,原先的整棵樹將作為 v 的左子樹。
示例 1:
輸入:
二叉樹如下所示:
v = 1
d = 2
輸出:
示例 2:
輸入:
二叉樹如下所示:
v = 1
輸出:
注意:
輸入的深度值 d 的範圍是:[1,二叉樹最大深度 + 1]。
輸入的二叉樹至少有一個節點。
方法1:
主要思路:解題彙總連結
(1)找到當前樹的第 d-1 層的所有資料,在該層下進行插入操作;
(2)使用層次遍歷,找出所有的 d-1 層結點,然後插入;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int v, int d) {
if(d==1){//處理特殊的情形
TreeNode* new_root=new TreeNode(v);
new_root->left=root;
return new_root;
}
queue<TreeNode*>q;
q.push(root);//初始化佇列
while (--d>1){//找到對應的層
int size_cur=q.size();
while(size_cur--){
TreeNode* cur_node=q.front();
q.pop();
if(cur_node->left){
q.push(cur_node->left);
}
if(cur_node->right){
q.push(cur_node->right);
}
}
}
while(!q.empty()){//在該層下插入
TreeNode* cur_node=q.front();
q.pop();
TreeNode* tmp=new TreeNode(v);//左子樹插入
tmp->left=cur_node->left;
cur_node->left=tmp;
tmp=new TreeNode(v);//右子樹插入
tmp->right=cur_node->right;
cur_node->right=tmp;
}
return root;
}
};
方法2:
主要思路:
(1)使用遞迴找出對應的層的結點,對該節點的左右子樹進行插入操作;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void insert(TreeNode* root,int v,int d,int cur_d){
if(root==NULL){//終止條件
return;
}
if(d==cur_d+1){//找到對應的層的結點,進行插入操作
TreeNode* tmp=new TreeNode(v);
tmp->left=root->left;
root->left=tmp;
tmp=new TreeNode(v);
tmp->right=root->right;
root->right=tmp;
}
else{//遞迴
insert(root->left,v,d,cur_d+1);
insert(root->right,v,d,cur_d+1);
}
}
TreeNode* addOneRow(TreeNode* root, int v, int d) {
if(d==1){//處理特殊當的情形
TreeNode* new_root=new TreeNode(v);
new_root->left=root;
return new_root;
}
//遞迴插入
insert(root,v,d,1);
return root;
}
};