次のコードのメモリの消費量について質問です。
「数百万のノードを持つT1と、数百のノードを持つT2の、2つの部分木があります。この時、T2がT1の部分木になっているかどうかを判定するアルゴリズムを作ってください。」
(解答例)
T1のノードを順に調べておき、そのノードとT2のルートが一致したら、treeMatchを呼び出します。treeMatchは2つの部分木が一致するかどうかを調べるメソッドです。
Java
1boolean containsTree(TreeNode t1, TreeNode t2) { 2 if(t2 == null) { //空の木は常に部分木 3 return true; 4 } 5 return subTree(t1,t2); 6 } 7 8 boolean subTree(TreeNode r1, TreeNode r2) { 9 if(r1 == null) { 10 return false; //大きい方の木が空で、部分木がまだ見つかってない 11 } 12 if(r1.data == r2.data) { 13 if(matchTree(r1,r2)) return true; 14 } 15 return (subTree(r1.left,r2) || subTree(r1.right,r2)); 16 } 17 18 boolean matchTree(TreeNode r1, TreeNode r2) { 19 if(r2 == null && r1 == null) //両方が空の場合 20 return true; //部分木に何も残ってない 21 22 //両方ではなく、片方がからの場合 23 if(r1 == null || r2 == null) { 24 return false; 25 } 26 27 if(r1.data != r2.data) 28 return false; //データが不一致 29 return (matchTree(r1.left, r2.left) && matchTree(r1.right, r2.right)); 30 }
この解法のメモリの消費量はO(log(n) + log(m))らしいのですが、なぜそうなるのでしょうか?
そもそもコードを見渡しても、データを保持する入れ物は見当たりませんが、最初にノードを受け取っているからメモリを消費するということなのでしょうか?
お分かりの方、回答お願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/05 14:13
2016/09/05 14:36