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

623 在二叉樹中增加一行

技術標籤: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 = 3
輸出:
在這裡插入圖片描述
注意:
輸入的深度值 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;
    }
};