C++のツリーに1行を追加
二分木があり、値vと深さdもあるとすると、指定された深さdに値vのノードの行を追加する必要があります。ルートノードは深さ1にあります。この操作を実行するには、このルールに従う必要があります-
深さdがわかっているので、深さd-1の有効なツリーノードNごとに、値vをNの左サブツリールートと右サブツリールートとして持つ2つのツリーノードを作成する必要があります。また、Nの元の左サブツリーは、新しい左サブツリールートの左サブツリーになり、元の右サブツリーは、新しい右サブツリールートの右サブツリーになります。深さdが1の場合、つまり深さd-1がまったくない場合は、元のツリー全体の新しいルートとして値vを使用してツリーノードを作成します。元のツリーは、新しいルートの左側のサブツリーです。
>したがって、入力が次のような場合
その場合、出力は次のようになります
これを解決するには、次の手順に従います-
-
dが1と同じ場合、-
-
temp=値vの新しいノード
-
tempの左側:=root
-
ルート:=temp
-
-
それ以外の場合
-
st
と呼ばれるペアのスタックを1つ定義します -
{root、2}をst
に挿入します -
lvl:=0
-
1ペアの温度を定義する
-
(stが空ではない)間、-
-
temp:=stの最上位要素
-
stから要素を削除
-
lvl:=tempの2番目の要素
-
node:=tempの最初の要素
-
lvlがdと同じ場合、-
-
temp1=値vの新しいノード
-
temp2=値vの新しいノード
-
temp1の左側:=ノードの左側
-
temp2の権利:=ノードの権利
-
ノードの左側:=temp1
-
ノードの右側:=temp2
-
-
それ以外の場合
-
ノードの左側が有効な場合、-
-
{ノードの左側、lvl+1}をst
に挿入します
-
-
ノードの権利が有効な場合、-
-
{ノードの右側、lvl+1}をst
に挿入します
-
-
-
-
-
ルートを返す
例
理解を深めるために、次の実装を見てみましょう-
#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, ]
-
C++の各ツリー行で最大値を見つける
二分木があるとすると、その木の各レベルの最大の要素を見つける必要があります。したがって、ツリーが次のような場合- その場合、出力は[3,5,8]になります。 これを解決するには、次の手順に従います- ansという配列を定義します 再帰関数solve()を定義します。これはツリーノードを取り、レベルは最初は0です。このメソッドは-のように機能します。 ノードがnullの場合は、を返します。 level =ansのサイズの場合、ノード値をansに挿入します。それ以外の場合、ans [level]:=ans[level]とノード値の最大値 呼び出しsol
-
C++で左下のツリー値を検索
二分木があるとします。そのツリーの最後の行の左端の値を見つける必要があります。したがって、ツリーが次のような場合- 最後の行が[7、4]であり、左端の要素が7であるため、出力は7になります。 これを解決するには、次の手順に従います- 最初にansとlvl変数を0として定義します solve()と呼ばれる1つのメソッドを定義します。これはツリーノードを取り、レベルは最初は0です。これは次のように機能します- ノードがnullの場合は、を返します。 lvlの場合、ans:=ノードの値およびlvl:=level 解決(ノードの左側、レベル+ 1)