タイトル書かれたアルゴリズム(27):単方向リングリストのエントリのリングノードが存在するか否かを判断し、二重の木を見つける&分析2が等しいです...

トピック:シクロアルキル環は、入口ノードを見つけた場合、単独でリンクされたリストの環が存在するかどうかを決定します。

分析:

  • 最初の問題:使用ポインタの速度(2倍の速ポインタを移動、遅いポインタが一度さらに一歩進み、NULLに到達するかどうかを判断するには、速い==遅い設立場合は、リストにはリングを持っています)。
  • 第二の問題:速い遅いとの出会いは、遅くも革命(矛盾証明可能)が完了していない必要があります。
     
     模式図

    AB |が|入口から変化開始点を示し、A2 = | CB |が距離リングへのエントリポイントのミーティングポイントを表し、S1 = | AB出発点は、Bは、次いで、A1 =環状入口点、C点が満たされています| + | BC |リングの長さを表し| BCB |ポインタの長さを遅く表し、s2は、高速の長さ、C =を行くためのポインタを表し
    時間が二倍の長さによって満たされているので、2倍遅いため、高速に
    S2 = 2×S1 = A1 + N * C +(S1-A1)(1)
    N(1)得られた溶解し、リングに巻き速い歩行の数を表し:
    S1 = N * C(2)、
    A1とA2との間の関係を見出すことです:
    A2 = C-(S1-A1)(3)
    (2)〜(3)を得へ:
    A1 = A2 +(N-1)* C(4)
    始点A、ポインタからN METからのIFポインタmよう最終的に開始ポインタm後の点Cと点Bで出会う、Nバイパス(N-1)リング

問題解決:

1つの 構造体ノード{
 2          INT V。
3          ノード* 次の;
4  }。
5ノード* IsCycle(ノード* ヘッド){
 6          ノード*高速=頭部、*遅い= ヘッド。
7  
8          ながら){
 9                  であれば(速い!= NULL)
 10                          高速=急速> 次。
11                  もし(速い!= NULL)
 12                          ファスト=急速> 次。
13                  他に
14                          のリターンNULL;
15                 もし(!=遅いNULL)
 16                          遅い=スロー>を次の;
17                  他に
18                          のリターンNULL;
19  
20                  であれば(速い== 遅い)
 21                          リターン速いです。
22          }
 23  }
 24ノード* FindEntry(ノード*ヘッド、ノード* ジョイント){
 25          ノード×m個=頭部、* N = ジョイント。
26          一方){
 27                  かの(M個の==のN)
 28                          リターンM。
29                  、M = M-> 次。
30                  N = N> 次。
31          }
 32  }
 33  INT メイン(){
 34          ノード* B1 = 新しいノード()。B1-> V = 1 ;
35          ノード* B2 = 新しいノード()。B2-> V = 2 ; B1->次= B2。
36          ノード* B3 = 新しいノード()。b3-> V = 3 ; B2->次= B3。
37          ノード* B4 = 新しいノード()。b4-> V = 4 ; b3->次に= B4。
38          ノード* B5 = 新しいノード()。b5-> V = 5; b4->次= B5。
39          ノード* B6 = 新しいノード(); b6-> V = 6 ; b5->次= B6。
40          ノード* B7 = 新しいノード(); B7-> V = 7 ; b6->次に= B7。
41          ノード* B8 = 新しいノード(); b8-> V = 8 ; B7->次= B8。b8->次= B3。
42  
43          ノード*の温度;
44          であれば((TEMP = IsCycle(B1))!= NULL){
 45                  のprintfは(" \ nの関節点がある:%のD "、temp-> V)。
46                  のprintf(" サイクルの\のNtheのエントリがあります。%D "、FindEntry(B1、TEMP) - > V)。
47          }
 48          、他の
49                  のprintf(" \のnthereが何サイクルではありません。" );
50          リターン 0 ;
51 }

 

トピック: 2つのデュアルツリー同じ(左と右サブツリー比較を横切ることができない)かどうかを決定します。

分析:再帰的実装、ツリー内のKレベル、2 ^ Kのノードが存在し、それがあろう(2 ^ K)* 2回の呼び出しは、時間の複雑さはO(N)です。

問題解決:

1つの 構造体ノード{
 2          のint 値。
3          ノード* 左;
4          ノード* 右;
5  }。
6  
7  ブール CompareTree(ノード*まず、ノード* 秒){
 8          であれば(最初== NULL &&第== NULL)
 9                  リターン 10          であれば(!(第== NULL &&秒= NULL)||
 11                          !(第一= NULL &&第== NULL))
 12                  リターン 13          もし(初段>値!= 2番目に> 値)
14                  リターン はfalse ;
15          リターン CompareTree(初段>左、2次>左)&&
 16                          CompareTree(初段>右、2次> 右)。
17 }

 

ます。https://www.cnblogs.com/leo-chen-2014/p/3747122.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33888907/article/details/94232106