C++で最大のBSTサブツリー
二分木があるとしましょう。その中で最大のサブツリーを見つける必要があります。ここで、最大とは、ノードの数が最も多いサブツリーを意味します。
したがって、入力が次のような場合、
この場合、最大のBSTサブツリーが強調表示されているため、出力は3になります。
これを解決するには、次の手順に従います-
-
データと呼ばれる1つの構造を定義します。サイズ、maxVal、minVal、okの4つの値があり、okはtrue/falseの値のみを保持できます
-
解決(TreeNode *ノード)
-
ノードがnullの場合、&miuns;
-
初期化してデータを返す(0、無限大、-無限大、真)
-
-
左:=solve(ノードの左側)
-
左:=solve(ノードの右)
-
currと呼ばれる1つのデータを定義します
-
curr.ok:=false
-
ノードのval>=right.minValの場合、-
-
リターンカー
-
-
ノードのvalが<=left.maxValの場合、-
-
リターンカー
-
-
left.okがtrueで、right.okがtrueの場合、-
-
curr.sz:=1 + left.sz + right.sz
-
curr.ok:=true
-
curr.maxVal:=最大(ノードの値とright.maxVal)
-
curr.minVal:=最大(ノードとleft.minValの値)
-
-
curr.okがtrueの場合、-
-
ret:=retとcurr.szの最大値
-
リターンカー
-
-
メインの方法から、次のようにします-
-
ret:=0
-
解決(ルート)
-
retを返す
例
理解を深めるために、次の実装を見てみましょう-
#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; } struct Data{ int sz; int maxVal; int minVal; bool ok; Data(){} Data(int a, int b, int c, bool d){ sz = a; minVal = b; maxVal = c; ok = d; } }; class Solution { public: int ret; Data solve(TreeNode* node){ if (!node) return Data(0, INT_MAX, INT_MIN, true); Data left = solve(node->left); Data right = solve(node->right); Data curr; curr.ok = false; if (node->val >= right.minVal) { return curr; } if (node->val <= left.maxVal) { return curr; } if (left.ok && right.ok) { curr.sz = 1 + left.sz + right.sz; curr.ok = true; curr.maxVal = max(node->val, right.maxVal); curr.minVal = min(node->val, left.minVal); } if (curr.ok) ret = max(ret, curr.sz); return curr; } int largestBSTSubtree(TreeNode* root){ ret = 0; solve(root); return ret; } }; main(){ Solution ob; vector<int< v = {10,5,15,1,8,NULL,7}; TreeNode *root= make_tree(v); cout << (ob.largestBSTSubtree(root)); }
入力
[10,5,15,1,8,null,7]
出力
3
-
TwoSumIV-入力はC++のBSTです
二分探索木と1つのターゲット値があるとします。合計が指定されたターゲットと等しくなるように、BSTに2つの要素が存在するかどうかを確認する必要があります。 したがって、入力が次のような場合 その場合、出力はTrueになります。 これを解決するには、次の手順に従います- 配列を定義するv 関数inorder()を定義します。これはルートになります ルートがnullの場合、- 戻る 順序なし(ルートの左側) ルートの値をvに挿入 順序なし(ルートの左側) 関数findnode()を定義します。これにはkがかかります n:=vのサ
-
C++でBSTをグレーターツリーに変換する
バイナリ検索ツリーがあるとすると、元のBSTのすべてのキーが元のキー+ BSTの元のキーよりも大きいすべてのキーの合計に変更されるように、それをグレーターツリーに変換する必要があります。 したがって、入力が次のような場合 その場合、出力は次のようになります これを解決するには、次の手順に従います- 関数revInorder()を定義します。これにより、ツリールートとsが取得されます。 ルートがnullの場合、- 戻る revInorder(ルートの権利、s) s:=s+ルートの値 ルートの値:=s revInorder(ルートの