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

C++のBSTIIの後継者


二分探索木にノードがあるとすると、BSTでそのノードの順序どおりの後続ノードを見つける必要があります。順序どおりの後続がない場合は、nullを返します。ノードの後継は、ノードの値よりも小さいキーを持つノードであることがわかっています。

ノードには直接アクセスできますが、ツリーのルートにはアクセスできません。ここで、各ノードはその親ノードへの参照を持ちます。以下はノードの定義です-

class Node {
   public int val;
   public Node left;
   public Node right;
   public Node parent;
}

入力が-

のような場合

C++のBSTIIの後継者

ノードが2の場合、出力は3になります。

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

  • ノードの権利がnullでない場合、-

    • ノード:=ノードの右側

    • ノードの左側がnullでない場合は、-

      を実行します。
      • ノード:=ノードの左側

    • リターンノード

  • 一方(ノードの親がnullでなく、ノードがノードの親の左側と等しくない)、do-

    • node:=ノードの親

  • リターンノードの親

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

#include <bits/stdc++.h>
using namespace std;
class Node {
public:
   int val;
   Node* left;
   Node* right;
   Node* parent;
   Node(int v, Node* par = NULL){
      val = v;
      left = NULL;
      right = NULL;
      parent = par;
   }
};
class Solution {
public:
   Node* inorderSuccessor(Node* node) {
      if (node->right) {
         node = node->right;
         while (node->left)
         node = node->left;
         return node;
      }
      while (node->parent && node != node->parent->left) {
         node = node->parent;
      }
      return node->parent;
   }
};
main(){
   Solution ob;
   Node *root = new Node(5);
   root->left = new Node(3, root);
   root->right = new Node(6, root);
   root->left->left = new Node(2, root->left);
   root->left->right = new Node(4, root->left);
   root->left->left->left = new Node(1, root->left->left);
   cout << (ob.inorderSuccessor(root->left->left))->val;
}

入力

Node *root = new Node(5);
root->left = new Node(3, root);
root->right = new Node(6, root);
root->left->left = new Node(2, root->left);
root->left->right = new Node(4, root->left);
root->left->left->left = new Node(1, root->left->left);
(ob.inorderSuccessor(root->left->left))->val

出力

3

  1. C++のバイナリツリーでノードの後続を事前注文する

    この問題では、二分木とノード値が与えられます。私たちのタスクは、ノードのプレオーダーサクセサを印刷することです。 二分木 は、各ルートノードが最大2つの子ノードを持つことができる特殊なタイプのツリーです。 プレオーダートラバーサル ツリーのノードをトラバースする方法です。ここでは、最初にルートノードをトラバースし、次に左の子、次に右の子をトラバースします。 後続ノードの事前注文 ノードのプレオーダートラバーサルでノードの隣に来るノードです。 問題を理解するために例を見てみましょう Input: 9 Output 0 Explanation: the preorder traver

  2. C ++の特定のBSTのすべてのノードに、より大きな値をすべて追加しますか?

    BSTまたは二分探索木は、すべての左ノードがルート値よりも小さく、すべての右ノードが大きい二分木の形式です。この問題では、バイナリツリーを取得し、現在のノードより大きいすべての値を追加します。 「BSTのすべてのノードにすべての大きい値を追加する」という問題は単純化されています。BSTの場合、現在のノード値よりも大きいすべてのノード値をそのノード値に追加します。 BST問題ステートメントの各ノードにすべての大きい値を追加します- 二分探索木(BST)が与えられた場合、各ノードに、より大きな値のすべてのノードの合計を追加する必要があります。 説明 このプログラムは、BSTを、すべての