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

指定された範囲でBSTキーを出力します-O(1)スペース(C ++)


この問題では、2つの値k1とk2(k1 印刷するプログラムを作成することです。

問題の説明: n1からn2までのツリーのすべてのキーを昇順で印刷します。

問題を理解するために例を見てみましょう。

入力:

指定された範囲でBSTキーを出力します-O(1)スペース(C ++)

k1 =4、k2 =12

出力: 6、7、9

ソリューションアプローチ

簡単に、順序付き走査を使用して問題を解決できます。 しかし、スペースの複雑さは0(n)ですが、時間の必要性はO(1)の複雑さで解決することです。したがって、このために、特殊なタイプのトラバーサル手法を使用します。

Morris Traversalを使用します これは、スレッド化された二分木に基づいています。スタック/キューを必要とせず、NULLポインターを使用して情報を格納します。これにより、ストレージをO(1)に減らすことができます。

問題を解決するためのモリストラバーサルの動作を説明するプログラム

#include <iostream>
using namespace std;

struct node {
   int data;
   struct node *left, *right;
};

node* insertNode(int data) {
   node* temp = new node;
   temp->data = data;
   temp->right = temp->left = NULL;
   return temp;
}

void RangeTraversal(node* root, int k1, int k2) {
   
   if (!root)
      return;
     
   node* nodeTraversal = root;

   while (nodeTraversal) {

      if (nodeTraversal->left == NULL) {

         if (nodeTraversal->data <= k2 &amp;&amp; nodeTraversal->data >= k1)
         
            cout<<nodeTraversal->data<<" ";
         nodeTraversal = nodeTraversal->right;
      }

      else {
         node* prevNode = nodeTraversal->left;
         while (prevNode->right != NULL &amp;&amp; prevNode->right != nodeTraversal)
            prevNode = prevNode->right;

         if (prevNode->right == NULL) {
            prevNode->right = nodeTraversal;
            nodeTraversal = nodeTraversal->left;
         }
         else {
            prevNode->right = NULL;
            if (nodeTraversal->data <= k2 &amp;&amp; nodeTraversal->data >= k1)
               cout<<nodeTraversal->data<<" ";
            nodeTraversal = nodeTraversal->right;
         }
      }
   }
}

int main() {
   node* root = insertNode(6);
   root->left = insertNode(3);
   root->right = insertNode(2);
   root->left->left = insertNode(1);
   root->left->right = insertNode(7);
   root->right->right = insertNode(9);

   cout<<"All BST keys in the given range are \t";
   RangeTraversal(root, 4, 10);
   
   return 0;
}

出力

All BST keys in the given range are 7 6 9

  1. C++の特定の範囲にあるBSTノードをカウントします

    ノードと範囲で構成される二分探索木が与えられます。タスクは、指定された範囲内にあるノードの数を計算し、結果を表示することです。 二分探索木(BST)は、すべてのノードが以下のプロパティに従うツリーです- ノードの左側のサブツリーには、その親ノードのキー以下のキーがあります。 ノードの右側のサブツリーには、その親ノードのキーよりも大きいキーがあります。 したがって、BSTはすべてのサブツリーを2つのセグメントに分割します。左側のサブツリーと右側のサブツリーで、次のように定義できます- left_subtree(キー)≤node(キー)≤right_subtree(キー) 例

  2. 与えられた行列をC++で反時計回りのスパイラル形式で印刷します

    この問題では、2次元の行列が与えられます。そして、私たちのタスクは、から反時計回りのスパイラルで行列の要素を印刷することです。 反時計回りのスパイラルフォーム −これは、左上から始まり、反時計回りに最初の右下から左上に向かって進むスパイラルトラバーサルです。 反時計回りのトラバーサルは159 13 14 15 16 12 8 4 3 2 6 10117になります。 問題を理解するために例を見てみましょう Input:    2 4 6    1 7 9    5 0 3 Output: 2 1 5 0 3 9 7 この問