在 C++ 中向树添加一行
假设我们有一棵二叉树,我们也有值 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, ]