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;