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;