C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のバイナリ検索ツリーでプレオーダーシーケンスを確認する


数列があるとします。それが二分探索木の正しいプレオーダートラバーサルシーケンスであるかどうかを確認する必要があります。シーケンス内の各番号は一意であると想定できます。次の二分探索木を考えてみましょう-

C++のバイナリ検索ツリーでプレオーダーシーケンスを確認する

したがって、入力が[5,2,1,3,6]のような場合、出力はtrueになります

これを解決するには、次の手順に従います-

  • itr:=-1

  • 低:=-infinity

  • 初期化i:=0の場合、i <プレオーダーのサイズの場合、更新(iを1増やします)、実行-

    • x:=preorder [i]

    • x

      • falseを返す

    • while(itr> =0 and preorder [itr]

      • 低:=preorder [itr]

      • (itrを1減らします)

    • (itrを1増やします)

    • preorder [itr]:=x

  • trueを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool verifyPreorder(vector<int<& preorder) {
      int itr = -1;
      int low = INT_MIN;
      for (int i = 0; i < preorder.size(); i++) {
         int x = preorder[i];
         if (x < low)
            return false;
         while (itr >= 0 && preorder[itr] < x) {
            low = preorder[itr];
            itr--;
         }
         itr++;
         preorder[itr] = x;
      }
      return true;
   }
};
main(){
   Solution ob;
   vector<int< v = {5,2,1,3,6};
   cout << (ob.verifyPreorder(v));
}

入力

{5,2,1,3,6}

出力

1

  1. C++での二分木から二分探索木への変換

    二分木 は、ツリーの各ノードが最大2つの子ノードを持つことができる特殊なタイプのツリーです。これらの子ノードは、右の子および左の子と呼ばれます。 単純な二分木は-です 二分探索木(BST) は、次のルールに従う特殊なタイプのツリーです- 左の子ノードの値は常に親よりも小さくなります注 右側の子ノードは、親ノードよりも大きな値を持っています。 すべてのノードが個別に二分探索木を形成します。 二分探索木(BST)の例 − バイナリ検索ツリーは、検索、最小値と最大値の検索などの操作の複雑さを軽減するために作成されます。 ここでは、二分木が与えられており、

  2. C ++プログラムでの二分探索?

    二分探索は、半区間探索、対数探索、または二分探索とも呼ばれ、ソートされた配列内のターゲット値の位置を見つける検索アルゴリズムです。二分探索は、ターゲット値を配列の中央の要素と比較します。それらが等しくない場合、ターゲットが存在できない半分が削除され、残りの半分で検索が続行され、再び中央の要素がターゲット値と比較され、ターゲット値が見つかるまでこれが繰り返されます。残りの半分が空の状態で検索が終了した場合、ターゲットは配列に含まれていません。アイデアは単純ですが、バイナリ検索を正しく実装するには、特に配列の値が範囲内の整数のすべてではない場合、終了条件と中間点の計算に関する微妙な点に注意する必要