在 C++ 中向树添加一行

c++server side programmingprogramming

假设我们有一棵二叉树,我们也有值 v 和深度 d,我们必须在给定的深度 d 处添加一行值为 v 的节点。根节点位于深度 1。我们必须遵循此规则来执行此操作 −

由于我们知道深度 d,对于深度为 d-1 的每个有效树节点 N,我们必须创建两个值为 v 的树节点作为 N 的左子树根和右子树根。并且 N 的原始左子树将是新左子树根的左子树,其原始右子树将是新右子树根的右子树。当深度 d 为 1 时,意味着根本没有深度 d-1,然后创建一个值为 v 的树节点作为整个原始树的新根,原始树是新根的左子树。

因此,如果输入如下

那么输出将是

为了解决这个问题,我们将遵循以下步骤−

  • 如果 d 与 1 相同,则 −

    • temp = 值为 v 的新节点

    • temp 的左侧 := root

    • root := temp

  • 否则

    • 定义一个名为 st 的对堆栈

    • 将 { root, 2 } 插入 st

    • lvl := 0

    • 定义一对 temp

    • 当(st 不为空)时,执行 −

      • temp := top element of st

      • 从 st 中删除元素

      • lvl := temp 的第二个元素

      • node := temp 的第一个元素

      • 如果 lvl 与 d 相同,则 −

        • temp1 = 值为 v 的新节点

        • temp2 = 值为 v 的新节点

        • temp1 的左侧 := 节点的左侧

        • temp2 的右侧 := 节点的右侧

        • 节点的左侧 := temp1

        • 节点的右侧 := temp2

      • 否则

        • 如果节点左侧有效,则 −

          • 将 {节点左侧,等级 + 1} 插入 st

        • 如果节点右侧有效,则 −

          • insert {right of node, lvl + 1} into st

  • return root

示例

让我们看看下面的实现以便更好地理解 −

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data){
      val = data;
      left = NULL;
      right = NULL;
   }
};
void insert(TreeNode **root, int val){
   queue<TreeNode*> q;
   q.push(*root);
   while(q.size()){
      TreeNode *temp = q.front();
      q.pop();
      if(!temp->left){
         if(val != NULL)
            temp->left = new TreeNode(val);
         else
            temp->left = new TreeNode(0);
         return;
      }else{
         q.push(temp->left);
      }
      if(!temp->right){
         if(val != NULL)
            temp->right = new TreeNode(val);
         else
            temp->right = new TreeNode(0);
         return;
      }else{
         q.push(temp->right);
      }
   }
}
TreeNode *make_tree(vector<int> v){
   TreeNode *root = new TreeNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      insert(&root, v[i]);
   }
   return root;
}
void tree_level_trav(TreeNode*root){
   if (root == NULL) return;
      cout << "[";
   queue<TreeNode *> q;
   TreeNode *curr;
   q.push(root);
   q.push(NULL);
   while (q.size() > 1) {
      curr = q.front();
      q.pop();
      if (curr == NULL){
         q.push(NULL);
      }
      else {
         if(curr->left)
            q.push(curr->left);
         if(curr->right)
            q.push(curr->right);
         if(curr == NULL || curr->val == 0){
            cout << "null" << ", ";
         }
         else{
            cout << curr->val << ", ";
         }
      }
   }
   cout << "]"<<endl;
}
class Solution {
public:
   TreeNode* addOneRow(TreeNode* root, int v, int d) {
      if (d == 1) {
         TreeNode* temp = new TreeNode(v);
         temp->left = root;
         root = temp;
      }
      else {
         stack<pair<TreeNode*, int> > st;
         st.push({ root, 2 });
         int lvl = 0;
         pair<TreeNode*, int> temp;
         TreeNode* node;
         while (!st.empty()) {
            temp = st.top();
            st.pop();
            lvl = temp.second;
            node = temp.first;
            if (lvl == d) {
               TreeNode* temp1 = new TreeNode(v);
               TreeNode* temp2 = new TreeNode(v);
               temp1->left = node->left;
               temp2->right = node->right;
               node->left = temp1;
               node->right = temp2;
            }
            else {
               if (node->left && node->left->val != 0) {
                  st.push({ node->left, lvl + 1 });
               }
               if (node->right && node->right->val != 0) {
                  st.push({ node->right, lvl + 1 });
               }
            }
         }
      }
      return root;
   }
};
main(){
   Solution ob;
   vector<int> v = {4,2,6,3,1,5};
   TreeNode *root = make_tree(v);
   tree_level_trav(ob.addOneRow(root, 1, 2));
}

输入

{4,2,6,3,1,5}, 1, 2

输出

[4, 1, 1, 2, 6, 3, 1, 5, ]

相关文章