C++でバイナリ検索ツリーのInorderSuccessorを検索するプログラム
二分探索木BSTとノードの別の値があるとすると、BSTでそのノードの順序どおりの後続を見つける必要があります。ノードpの後継は、pの値よりも大きい最小のキーを持つノードであることは誰もが知っています。
したがって、入力が次のような場合
そして、p =1の場合、出力は2になります
これを解決するには、次の手順に従います-
- 再帰的メソッドinorderSuccessor()を定義します。これは、ルートとpを取得します
- ルートがnullの場合、次のようになります。
- nullを返す
- ルートの値<=pの値の場合:
- return inorderSuccessor(rootの権利、p)
- それ以外の場合
- option:=inorderSuccessor(rootの左側、p)
- 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; } }; 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; }
入力
TreeNode *root = new TreeNode(2); root->left = new TreeNode(1); root->right = new TreeNode(3); 1
出力
2
-
C ++プログラムでの二分探索?
二分探索は、半区間探索、対数探索、または二分探索とも呼ばれ、ソートされた配列内のターゲット値の位置を見つける検索アルゴリズムです。二分探索は、ターゲット値を配列の中央の要素と比較します。それらが等しくない場合、ターゲットが存在できない半分が削除され、残りの半分で検索が続行され、再び中央の要素がターゲット値と比較され、ターゲット値が見つかるまでこれが繰り返されます。残りの半分が空の状態で検索が終了した場合、ターゲットは配列に含まれていません。アイデアは単純ですが、バイナリ検索を正しく実装するには、特に配列の値が範囲内の整数のすべてではない場合、終了条件と中間点の計算に関する微妙な点に注意する必要
-
二分探索木で左回転を実行するC++プログラム
二分探索木は、すべてのノードが次の2つのプロパティを持つソートされた二分木です- ノードの右側のサブツリーには、親ノードのキーよりも大きいすべてのキーがあります。 ノードの左側のサブツリーには、親ノードのキーよりも少ないすべてのキーがあります。各ノードには2つ以上の子を含めることはできません。 木の回転は、二分木の要素の順序を妨げることなく構造を変更する操作です。ツリー内で1つのノードを上に移動し、1つのノードを下に移動します。これは、ツリーの形状を変更したり、小さいサブツリーを下に移動したり、大きいサブツリーを上に移動したりして高さを低くしたりするために使用され、多くのツリー操作の