【leetcode] 1379。その木のクローンにバイナリツリーの対応するノードを探します
リンク
説明
元の2つのバイナリツリーを与えられ、クローン化され、元のツリー内のノードのターゲットへの参照を与えられます。
クローン化された木は、元のツリーのコピーです。
クローン化されたツリー内の同じノードへの参照を返します。
あなたは2つのツリーまたはターゲット・ノードのいずれかを変更することが許可されていないと答えはクローン化されたツリー内のノードへの参照でなければならないことに注意してください。
フォローアップ:木の上繰り返される値が許可されている場合は、問題を解決します。
例1:
入力:木= [7,4,3、NULL、NULL、6,19]、目標= 3
出力:3
説明:全ての実施例では、元とクローン化された木が示されています。ターゲットノードは、元のツリーからの緑色のノードです。答えは、クローン化されたツリーから黄色のノードです。
例2:
入力:木= [7]、目標= 7
出力:7
例3:
入力:木= 8、ヌル、6、ヌル、5、ヌル、4、ヌル、3、NULL、2、NULL、1]、目標= 4
出力:4
例4:
入力:木= [1,2,3,4,5,6,7,8,9,10]、目標= 5
出力:5
例5:
入力:木= [1,2、NULL、3]、目標= 2
出力:2
制約:
ツリー内のノードの数は、範囲[1、10 ^ 4]です。
ツリーのノードの値は一意です。
ターゲット・ノードは、元のツリーからノードであり、nullではありません。
解決
最も簡単なBFS(幅優先トラバーサル)を使用するとことができます。
class Solution {
public:
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
queue<TreeNode*> oq, cq;
if (original == NULL)
return NULL;
oq.push(original);
cq.push(cloned);
while (!oq.empty())
{
TreeNode *tmp = oq.front();
TreeNode *tmpC = cq.front();
oq.pop();
cq.pop();
if (tmp == target)
return tmpC;
if (tmp->left)
{
oq.push(tmp->left);
cq.push(tmpC->left);
}
if (tmp->right)
{
oq.push(tmp->right);
cq.push(tmpC->right);
}
}
return NULL;
}
};
分析
O(N)の時間計算量は、nは、バイナリツリー内のノードの数は、ツリーの各ノードは一度だけ横断され、
Oの空間複雑度(1)