アルゴリズム書かれた質問(09):指定された2つの数や建設&BSTミラーツリーの値を探します

トピック:入力アレイ及びaはソートを昇順番号を有し、配列内で検索するために、2つの数値を必要とし、デジタル入力に正確に等しいこれら二つの数字、デジタル出力の任意のペアは、時間の複雑さを必要とすることがOであります(N-);

分析:ソートされた配列{... I ... J ... K ...上昇のために Mを......}、 iがm = J + Kを+のみであってもよいが( J およびKは、同一番号でもよい)、中間無視する両側から収縮することができます他のクロス合計ケースと

問題解決:

1  空隙 FindSumFactor(INT *配列、int型の長さ、int型SUM){
 2          INT左= 0、=長さ右1 図3          、一方真の){
 4                  / * *
 5                   *と電流の和よりも小さい場合には、左右にモバイル;
 6                   *と電流は、左から右に移動和よりも大きい場合に
 7                   各のみポインタを移動するため*、左右とは確かに一致する
 8を                  心配アレイオーバーフローが存在しない*
 9。                  * * / 
10                  IF(配列[左] +配列[右] < SUM){
図11は、                          ++を残し12である                  }  IF(配列[左] +配列[右]> SUM){
 13で                          右- ;
 14                  }
 15  
16                  / * *
 17                   *は個別であるか否かを同じ判断ので、左処理及び右ことができる
 18であります                  *重複は、それらの合計が等しく、
 19。                  * * / 
20である                 IF(配列[左] +配列[右] == 合計){
 21である                          のprintf(" \ nの和因子である:D%は、D%\ N- " 22                                         アレイ[左]、配列[右])。
23                          出口(0 );
24                  }
 25  
26                  であれば(左> = 右){
 27                          のprintf(" \ nfail和因子の\ nを見つけること" )。
28                          出口(0 );
29                  }
 30          }
 31 }

 

トピック: 2元検索ツリーを入力して、二つの方法で生成された再帰ループミラーツリー、すなわち木の左の部分木のノードは、新しい右サブツリーのノードよりも大きいの使用を必要とします。

分析:補助構造を持たない単一のソースは、再帰サイクルを達成することができることができる、マルチソース(DFSとBFS)再帰サイクルを達成するために、補助構造の使用を必要とします。

問題解決:

1  / * *
 2  電流スイッチング電流の左と右のサブツリーの*、次いで左及び方法の右サブツリーを再帰的に
 3  *は、最終的に、ツリーのトップに現在のノードを返します。サブツリーがNULLサブツリーに対応するときことに注意
 4  *提供
 。5  * * / 
6ノードは* RecursiveMirrorTree(ノード* 現在){
 7          ノード*のTEMPを=>の電流ために左、
 8を         IF(電流-するため>右!= NULL){
 図9                  の電流に> = RecursiveMirrorTree(電流-する>左、右);
 10          } ほか
11。                 / * *
 12れる                  *がエラーに変化しない場合に、ここで注意しなければならない
 13                   * * / 
14                 >左=の電流ために、NULLを
 15  
16          IF(TEMP =!{NULL)
 17。                  >右=の電流ために、RecursiveMirrorTree(TEMP)を
 18れる          } そう
19。                  >右=の電流ためにNULLを、
 20である 
21ことで         戻り現在、
 22である }
 23れます * / *
 24  *単一の再帰的ソース(のみ再帰が発生し)、通常のサイクルを解決することができるため、マルチソースのための再帰
 25  *(複数の再帰は、左右のサブツリーとして、発生した)、補助データ構造が使用されなければならない、またはスタック
 26がある *またはキュー
 27  * * / 
28  空隙 NonRecursiveMirrorTree(ノード* ルート){
 29         MyStack *スタック= 新しいMyStack();
30          stack-> プッシュ(ルート)。
31          ノード*一時、* 現在;
32          ながら(!stack-> のisEmpty()){
 33                  、電流= stack-> POP();
34                  TEMP =電流- > 左。
35  
36                  場合(電流- >右!= NULL){
 37                          の電流> =電流- >左、右。
38                          stack->プッシュ(電流- > 右)。
39                  } 他に
40                         電流> =左NULLを。
41  
42                  であれば(TEMP =!NULL){
 43                          の電流>右= TEMP。
44                          stack-> プッシュ(TEMP)。
45                  } そうでなければ
46                          の電流>右= NULLを。
47          }
 48          削除スタック。
49 }

 

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

おすすめ

転載: blog.csdn.net/weixin_33829657/article/details/94232045