C++のバイナリツリーのリンクリスト
二分木ルートと、最初のノードとしてヘッドを持つリンクリストがあるとします。リンクリスト内の先頭から始まるすべての要素が、バイナリツリーで接続されている下向きのパスに対応している場合はTrueを返す必要があり、そうでない場合はFalseを返す必要があります。したがって、ツリーが次のような場合-
リンクリストが[1,4,2,6]の場合、出力はtrueになります。
これを解決するには、次の手順に従います-
-
マップdpを定義する
-
ソルブ()と呼ばれるメソッドを定義します。これはヘッド、ルート、フラグを取ります
-
ヘッドがnullの場合はtrueを返し、ルートがnullの場合はfalseを返します
-
dpにヘッドがあり、dp [head]にルートがあり、dp [head、root]にフラグがある場合は、dp [head、root、flag]
を返します。 -
ヘッドの値=ルートの値の場合、
-
ret:=solve(頭の次、ルートの左側、false)またはsolve(頭の次、ルートの右側、false)
-
retが設定されている場合、dp [head、root、flag]:=trueであり、dp [head、root、flag]
を返します。 -
dp [head、root、flag] =resolve(head、left of root、flag)またはsolve(head、right of root、flag)
-
dp [head、root、flag]
を返します
-
-
それ以外の場合、フラグが設定されていない場合は、dp [head、root、flag]:=false
を返します。 -
それ以外の場合は、dp [head、root、flag]:=resolve(head、left of root、flag)またはsolve(head、right of root、flag)
を返します。 -
メインメソッドからsolve(head、root、true)を呼び出します
例(C ++)
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
class ListNode{
public:
int val;
ListNode *next;
ListNode(int data){
val = data;
next = NULL;
}
};
ListNode *make_list(vector<int> v){
ListNode *head = new ListNode(v[0]);
for(int i = 1; i<v.size(); i++){
ListNode *ptr = head;
while(ptr->next != NULL){
ptr = ptr->next;
}
ptr->next = new ListNode(v[i]);
}
return head;
}
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int data){
val = data;
left = 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;
}
class Solution {
public:
map < ListNode*, map<TreeNode*, map <bool, bool>> > dp;
bool solve(ListNode* head, TreeNode* root, bool flag = true){
if(head == NULL) return true;
if(!root) return false;
if(dp.count(head) && dp[head].count(root) && dp[head]
[root].count(flag)) return dp[head][root][flag];
if(head->val == root->val){
bool ret = solve(head->next, root->left, false) ||
solve(head->next, root->right, false);
if(ret) return dp[head][root][flag] = true;
return dp[head][root][flag] = solve(head, root->left,
flag) || solve(head, root->right, flag);
}else if(!flag) return dp[head][root][flag] = false;
else
return dp[head][root][flag]= solve(head, root->left,
flag) || solve(head, root->right, flag);
}
bool isSubPath(ListNode* head, TreeNode* root) {
return solve(head, root);
}
};
main(){
vector<int> v = {1,4,2,6};
vector<int> v1 = {1,4,4,NULL,2,2,NULL,1,NULL,6,8,NULL,NULL,NULL,NULL,1,3};
ListNode *head = make_list(v);
TreeNode *root = make_tree(v1);
Solution ob;
cout << (ob.isSubPath(head, root));
} 入力
[1,4,2,6] [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]>
出力
1
-
バイナリツリーをC++のリンクリストにフラット化する
二分木があるとしましょう。リンクリストにフラット化する必要があります。したがって、ツリーが次のような場合- 出力ツリーは-になります これを解決するには、次の手順に従います- ser prev:=null rootを入力として受け取る再帰関数solve()を定義します。 ルートがnullの場合は、を返します。 解決(ルートの権利) 解決(ルートの左側) ルートの右側:=prev、ルートの左側:=null 前:=ルート 理解を深めるために、次の実装を見てみましょう- 例 #include <bits/stdc+
-
C++での二分木レベルの順序トラバーサル
二分木があるとします。レベル順トラバーサルスキームを使用して、このツリーをトラバースする必要があります。したがって、ツリーが次のような場合 トラバーサルシーケンスは次のようになります-[10、5、16、8、15、20、23] これを解決するには、次の手順に従います- ノードを格納するためのキューキューを定義する ルートをキューに挿入します。 queが空でない間は、 item:=キューの最前列にあるアイテム アイテムの価値を印刷する アイテムの左側がnullでない場合は、アイテムの左側をqueに挿入します アイテムの権利がnullでない場合は、アイテムの権利をqueに挿入します