C++のバイナリツリーの2番目の最小ノード
負でない値を持つ空でない特別な二分木があると仮定します。ここでは、このツリーの各ノードに正確に2つまたは0の子があります。ノードに2つの子がある場合、このノードの値は2つの子のうち小さい方の値になります。言い換えれば、[root.val =root.left.valの最小値、root.right.val]と言うことができます。そのような二分木がある場合、ツリー全体のすべてのノードの値で構成されるセットの2番目の最小値を見つける必要があります。そのような要素がない場合は、代わりに-1を返します。
したがって、入力が次のような場合
その場合、出力は5になります。最小値は2、2番目に小さい値は5です。
これを解決するには、次の手順に従います-
- 関数TraverseNodes()を定義します。これには、node、min、nextMin、 が必要です。
- ノードがnullの場合、-
- 戻る
- ノードの値>minの場合、-
- nextMinがノード
- nextMin:=ノードの値
- 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
-
C++のバイナリツリーでノードの後続を事前注文する
この問題では、二分木とノード値が与えられます。私たちのタスクは、ノードのプレオーダーサクセサを印刷することです。 二分木 は、各ルートノードが最大2つの子ノードを持つことができる特殊なタイプのツリーです。 プレオーダートラバーサル ツリーのノードをトラバースする方法です。ここでは、最初にルートノードをトラバースし、次に左の子、次に右の子をトラバースします。 後続ノードの事前注文 ノードのプレオーダートラバーサルでノードの隣に来るノードです。 問題を理解するために例を見てみましょう Input: 9 Output 0 Explanation: the preorder traver
-
C++の二分探索木で最小値のノードを見つけます
1つの二分探索木があるとします。二分探索木で最小要素を見つける必要があります。したがって、BSTが以下のような場合- 最小要素は1になります。 左のサブツリーは常に小さい要素を保持していることがわかっています。したがって、左がnullになるまで左のサブツリーを何度もトラバースすると、最小の要素を見つけることができます。 例 #include<iostream> using namespace std; class node{ public: node *left;