問題の説明:
二つの非空のバイナリツリーsおよびtが与えられると、ツリーTがSのサブツリーと全く同じ構造及びノード値を持っているかどうかをチェック。Sのサブツリーはツリーがs内のノードと、このノードの子孫のすべてで構成されています。ツリーsはまた、自身のサブツリーとして考えることができます。
例1:
木秒を考えます:
3 / \ 5 / \ 1 2
与えられた木T:
4 / \ 1 2
TがSのサブツリーと同じ構造及びノード値を有するので、trueを返します。
例2:
木Sを考えます:
3 / \ 5 / \ 1 2 / 0
与えられた木T:
4 / \ 1 2
falseを返します。
問題解決のアイデア:
トピック・ツリーでは、最初の反応は、この質問は例外ではありません答えるためにDFSを使用することです。
コード:
1 クラスのソリューション: 2 DEF isSubtree(セルフ、S:ツリーノード、T:ツリーノード) - > BOOL: 3 DEF DFS(B): 4。 IF ていない A または れていない B: #Ruoguoヌルの存在下で、B、処理手段 5に 戻り ませんと はありませんB 。6 #以下のプロセスA、Bは、ヌルが論じないどちらの場合である 。7 IF a.val == b.val および DFS(a.left、b.left)およびDFS( a.right、b.right): 8 リターン真 9 のIF Bは、IS:T #T Bがある場合、左右のサブツリーの決意は、Tのそれぞれ等しい 10 リターン DFS(a.left、T)またはDFS(a.right、T) 。11 12である 戻り偽 13れる 14 リターン DFS(S、T)
コードの4、5行は、様々なサブツリーは、決意条件と略記空の場合、合理化されたコードです。
現在のツリーの同一の木Tかどうかをライン7、8、および決定
図9に示すように、コードの10行は、時間t bは第二から来る場合は再帰の実行ならば現在のツリーの実行の決意がサブツリーであるため、その後、決意を行わないことを意味し、有効にすることであるのみtは、電流がツリーTかどうかが決定されるのと同じサブツリーは、同じではありませんです。
コードの最後の12行は、Falseに直接戻ります。それはDFS(トン)であった場合でも、コードの実行時間を75%に削減されますが、私は、なぜそんなに短い理解していません。