C++のBSTのInorderSuccessor
二分探索木とその中にノードがあるとすると、BSTでそのノードの順序どおりの後続を検索する必要があります。ノードpの後継は、p.valより大きい最小のキーを持つノードであることがわかっています。
したがって、入力がroot =[2,1,3]、p =1、
のような場合
その場合、出力は2になります
これを解決するには、次の手順に従います-
-
再帰的メソッドをinorderSuccessor()で定義します。これにより、ルートとp
が取得されます。 -
ルートがnullの場合、-
-
nullを返す
-
-
ルートのval<=pのvalの場合、-
-
inorderSuccessor(ルートの権利、p)を返す
-
-
それ以外の場合
-
オプション:=inorderSuccessor(ルートの左側、p)
-
return(オプションがゼロの場合はルート、それ以外の場合はオプション)
-
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; class Solution { public: TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) { if(!root) return NULL; if(root->val <= p->val){ return inorderSuccessor(root->right, p); } else{ TreeNode* option = inorderSuccessor(root->left, p); return !option ? root : option; } } }; main(){ TreeNode *root = new TreeNode(2); root->left = new TreeNode(1); root->right = new TreeNode(3); TreeNode *p = root->left; Solution ob; cout << (ob.inorderSuccessor(root, p))->val; }
入力
{2,1,3},1
出力
2
-
C++のBSTの2つのノード間の最大要素
問題の説明 N個の要素の配列と、指定された配列に属する2つの整数A、Bが与えられます。 arr[0]からarr[n-1]に要素を挿入して、二分探索木を作成します。タスクは、AからBへのパスで最大の要素を見つけることです。 例 配列が{24、23、15、36、19、41、25、35}の場合、次のようにBSTを形成できます- A=19およびB=41とすると、これら2つのノード間の最大要素は41です。 アルゴリズム ノードAおよびBの最も低い共通祖先(LCA)を見つけます。 LCAとAの間の最大ノードを見つけます。これをmax1と呼びましょう LCAとBの間の最大ノードを見つけます。こ
-
C++のBSTからの床と天井
ここでは、BSTから床と天井の値を見つける方法を説明します。たとえば、空きノードがBSTに配置されているメモリ管理システムを作成する場合です。入力リクエストに最適なものを見つけます。キー値よりも大きい最小のデータでツリーを下に移動するとします。3つのケースが考えられます。 ルートが鍵です。その場合、ルート値は上限値です ルートデータ<キーの場合、上限値は左側のサブツリーにないため、右側のサブツリーに進み、問題のあるドメインを減らします キーの場合、上限値は右側のサブツリーにある可能性があり、左側のサブツリーにキーよりも大きいデータを持つノードが見つかる可能性があります。そのような要素が存在し