C++のそのツリーのクローンでバイナリツリーの対応するノードを見つける
元の2つのバイナリツリーがあり、クローンが作成され、元のツリーのノードターゲットへの参照が指定されているとします。複製されたツリーは、実際には元のツリーのコピーです。複製されたツリーで同じノードへの参照を見つける必要があります。
したがって、ツリーが以下のようになり、ターゲットが3の場合、出力は3になります。
これを解決するには、次の手順に従います-
-
Solve()というメソッドを定義します。これにより、node1mnode2とtargetが取得されます
-
node1がnullの場合、nullを返します
-
node1がターゲットで、node 1の値がnode2の値である場合、node2を返します
-
leftPart:=solve(ノード1の左側、ノード2の左側、ターゲット)
-
rightPart:=solve(ノード1の右、ノード2の右、ターゲット)
-
leftPartがnullでない場合は、leftPartを返します。それ以外の場合は、rightPart
を返します。 -
メインメソッド呼び出しからreturnsolve(original、cloned、target)
例(C ++)
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int data){
val = data;
left = 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:
TreeNode* solve(TreeNode* node1, TreeNode* node2, TreeNode*
target){
if(!node1) return NULL;
if(node1 == target && node1->val == node2->val) return node2;
TreeNode* leftPart = solve(node1->left, node2->left, target);
TreeNode* rightPart = solve(node1->right, node2->right, target);
return leftPart? leftPart : rightPart;
}
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned,
TreeNode* target) {
return solve(original, cloned, target);
}
};
main(){
vector<int> v = {7,4,3,NULL,NULL,6,19};
TreeNode *root = make_tree(v);
TreeNode *cloned = make_tree(v);
TreeNode *target = root->right; //The node with value 3
Solution ob;
cout << (ob.getTargetCopy(root, cloned, target))->val;
} 入力
[7,4,3,null,null,6,19] 3
出力
3
-
C++のバイナリツリーでルートから特定のノードまでの距離を検索します
ノードが少ない二分木があると考えてください。ルートと別のノードuの間の距離を見つける必要があります。ツリーが次のようになっているとします。 これで、(root、6)=2の間の距離、パスの長さは2、(root、8)=3の間の距離などになります。 この問題を解決するために、再帰的アプローチを使用して、左右のサブツリーでノードを検索し、各レベルの長さも更新します。 例 #include<iostream> using namespace std; class Node { public: int data; &
-
C++の二分探索木で最小値のノードを見つけます
1つの二分探索木があるとします。二分探索木で最小要素を見つける必要があります。したがって、BSTが以下のような場合- 最小要素は1になります。 左のサブツリーは常に小さい要素を保持していることがわかっています。したがって、左がnullになるまで左のサブツリーを何度もトラバースすると、最小の要素を見つけることができます。 例 #include<iostream> using namespace std; class node{ public: node *left;