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

C++のバイナリツリーの2番目の最小ノード


負でない値を持つ空でない特別な二分木があると仮定します。ここでは、このツリーの各ノードに正確に2つまたは0の子があります。ノードに2つの子がある場合、このノードの値は2つの子のうち小さい方の値になります。言い換えれば、[root.val =root.left.valの最小値、root.right.val]と言うことができます。そのような二分木がある場合、ツリー全体のすべてのノードの値で構成されるセットの2番目の最小値を見つける必要があります。そのような要素がない場合は、代わりに-1を返します。

したがって、入力が次のような場合

C++のバイナリツリーの2番目の最小ノード

その場合、出力は5になります。最小値は2、2番目に小さい値は5です。

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

  • 関数TraverseNodes()を定義します。これには、node、min、nextMin、
  • が必要です。
  • ノードがnullの場合、-
    • 戻る
  • ノードの値>minの場合、-
    • nextMinがノード
    • nextMin:=ノードの値
  • TraverseNodes(ノードの左側、最小、次の最小)
  • TraverseNodes(ノードの右側、最小、次の最小)
  • メインの方法から次のようにします-
  • min:=rootがnullでない場合のrootの値、それ以外の場合は-1
  • nextMin:=-1
  • TraverseNodes(root、min、nextMin)
  • return nextMin
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class TreeNode{
       public:
          int val;
          TreeNode *left, *right;
          TreeNode(int data){
             val = data;
             left = NULL;
             right = NULL;
       }
    };
    void insert(TreeNode **root, int val){
       queue<TreeNode*> q;
       q.push(*root);
       while(q.size()){
          TreeNode *temp = q.front();
          q.pop();
          if(!temp->left){
             if(val != NULL)
                temp->left = new TreeNode(val);
             else
                temp->left = new TreeNode(0);
             return;
             }else{
                q.push(temp->left);
             }
             if(!temp->right){
                if(val != NULL)
                   temp->right = new TreeNode(val);
                else
                   temp->right = new TreeNode(0);
                return;
          }else{
             q.push(temp->right);
          }
       }
    }
    TreeNode *make_tree(vector<int> v){
       TreeNode *root = new TreeNode(v[0]);
       for(int i = 1; i<v.size(); i++){
          insert(&root, v[i]);
       }
       return root;
    }
    class Solution {
    public:
       int findSecondMinimumValue(TreeNode* root) {
          int min = (root && root->val != 0) ? root->val : -1;
          int nextMin = -1;
          TraverseNodes(root, min, nextMin);
          return nextMin;
       }
       void TraverseNodes(TreeNode* node, int min, int& nextMin) {
          if (!node || node->val == 0) {
             return;
          }
          if (node->val > min) {
             if (nextMin == -1 || node->val < nextMin) {
                nextMin = node->val;
             }
          }
          TraverseNodes(node->left, min, nextMin);
          TraverseNodes(node->right, min, nextMin);
       }
    };
    main(){
       Solution ob;
       vector<int> v = {2,2,5,NULL,NULL,5,7};
       TreeNode *root = make_tree(v);
       cout << (ob.findSecondMinimumValue(root));
    }

    入力

    {2,2,5,NULL,NULL,5,7}

    出力

    5

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

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

    2. C++の二分探索木で最小値のノードを見つけます

      1つの二分探索木があるとします。二分探索木で最小要素を見つける必要があります。したがって、BSTが以下のような場合- 最小要素は1になります。 左のサブツリーは常に小さい要素を保持していることがわかっています。したがって、左がnullになるまで左のサブツリーを何度もトラバースすると、最小の要素を見つけることができます。 例 #include<iostream> using namespace std; class node{    public:       node *left;