毎日のアルゴリズム: バランスのとれた二分木

毎日のアルゴリズム: バランスのとれた二分木

[[426529]]

この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載したもので、著者はsisterAnです。この記事を転載する場合は、「3分で学ぶフロントエンド」公式アカウントまでご連絡ください。

木の基礎については、こちらをご覧ください: 初心者のための木

二分木が与えられた場合、それが高さバランスの取れた二分木であるかどうかを判断します。

この問題では、高度にバランスのとれた二分木は次のように定義されます。

バイナリ ツリー内の各ノードの左側のサブツリーと右側のサブツリー間の高さの差の絶対値は 1 を超えません。

例1:

二分木[3,9,20,null,null,15,7]が与えられた場合

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

true を返します。

例2:

二分木[1,2,2,3,3,null,null,4,4]が与えられた場合

  1. 1
  2. / \
  3. 22
  4. / \
  5. 3 3
  6. / \
  7. 4 4

false を返します。

解決策 1: トップダウン (ブルートフォース)

解決方法: 各ノードの左サブツリーと右サブツリーの最大高さの差を上から下まで比較します。バイナリ ツリー内の各ノードの左サブツリーと右サブツリーの最大高さの差が 1 以下、つまり各サブツリーのバランスが取れている場合、バイナリ ツリーはバランスの取れたバイナリ ツリーです。

コード実装:

  1. const isBalanced =関数(ルート) {
  2. if(!root)戻り値 真実 
  3. Math.abs (depth(root.left ) -depth( root.right ) ) <= 1を返す
  4. && isBalanced(ルート.left )
  5. && isBalanced(ルート.right )
  6. }
  7. const depth =関数(ノード) {
  8. if(!node) は-1を返します
  9. 1 + Math.max ( depth(node.left ) ,depth(node.right ) )を返します
  10. }

複雑性分析:

  • 時間計算量: O(nlogn)、深さを計算する際に多くの冗長な操作がある
  • 空間計算量: O(n)

解決策2: ボトムアップ(最適化)

解決方法: バイナリ ツリー (左ルートと右ルート) の後続のトラバーサルを使用して、下から上へのサブツリーの最大の高さを返し、各サブツリーがバランスの取れたツリーであるかどうかを判断します。バランスが取れている場合は、その高さを使用して親ノードがバランスが取れているかどうかを判断し、親ノードの高さを計算します。バランスが取れていない場合は、-1 を返します。

バイナリ ツリー内の各ノードの左サブツリーと右サブツリーの深さを走査して比較します。

  • 左と右のサブツリーの深さを比較します。差が 1 より大きい場合は、現在のサブツリーが不均衡であることを示すフラグ -1 を返します。
  • 左と右のサブツリーのいずれかがバランスが取れていない場合、または左と右のサブツリーの差が 1 より大きい場合、バイナリ ツリーは不均衡です。
  • 左と右のサブツリーのバランスが取れている場合は、現在のツリーの深さ(左と右のサブツリーの最大深さ + 1)を返します。

コード実装:

  1. const isBalanced =関数(ルート) {
  2. balanced(root) !== -1を返す
  3. };
  4. const balanced =関数(ノード) {
  5. if (!node) が0 を返す
  6. 定数left = balanced ( node.left )
  7. 定数right = balanced( node.right )
  8. if (=== -1 ||=== -1 || Math.abs (-) > 1) {
  9. -1を返す
  10. }
  11. Math.max ( left , right )+1返す
  12. }

複雑性分析:

  • 時間計算量: O(n)
  • 空間計算量: O(n)

<<:  AIと自動化を活用して機密データを大規模に識別する方法

>>:  清華大学のAI学生が顔を見せて歌う、この応用は将来に期待される

推薦する

JavaScript におけるいくつかの一般的なソートアルゴリズムの共有

説明する各ブラウザテストから取得されるデータは異なります。たとえば、Chrome を使用してテストす...

ビジネス上の問題を機械学習の問題に変換するにはどうすればよいでしょうか?

[[197632]]機械学習が価値を変革するための最も重要なステップは何ですか?ビジネス上の問題に...

なぜRLの一般化は難しいのか:バークレーの博士が認知POMDPと暗黙の部分観測性から説明する

[[437395]]今日の強化学習 (RL) には、収束性が低いなど多くの問題があります。比較的弱い...

人間の姿勢評価技術の開発と実装

[51CTO.com クイック翻訳]関連調査レポートによると、デジタルフィットネス市場の規模は202...

OpenAIはニューヨークタイムズの声明は一方的であると不公平だと叫び、アンドリュー・ン氏もそれを擁護した。

2023年末、ニューヨーク・タイムズはマイクロソフトとOpenAIを訴えるための強力な証拠を提示し...

一貫性のあるハッシュアルゴリズムとJava実装

コンシステント ハッシュ アルゴリズムは、1997 年にマサチューセッツ工科大学によって提案された分...

...

インターネットで話題! 23歳の中国人医師が22歳の歴史的弱点を治す、ネットユーザー「この話はいいね」

最近、別の若い中国人男性が、22年間存在していたバグを修正したことでインターネット上で人気を博した。...

海外の科学者が「AI漢方」を開発:舌診断システムの精度は最大94%

10月23日、中国医学では2000年以上もの間、人の舌の色や形を観察して病気を診断してきたと報じら...

製造バリューチェーンにおいて RPA に真のチャンスはあるのでしょうか?

製造業における自動化の推進力は非常に単純です。自動化は人間の作業をシミュレートするため、人間は製造バ...

畳み込みニューラル ネットワークの実践 - Keras を使用して猫を識別する

近年、ディープラーニングの分野における畳み込みニューラルネットワーク(CNN または ConvNet...

追跡!フレーム!明らかにする!秘密!ついにボストンダイナミクスのロボットの詳細が明らかになった

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

ChatGPT がデータを取得しました!プログラミング言語ランキングを作る方法はありません!

執筆者 | Yan Zheng制作:51CTO テクノロジースタック(WeChat ID:blog)...

RPA 導入が失敗する 7 つの理由

ロボティック・プロセス・オートメーションは現在、業界全体のデジタル化を推進するデジタル変革の中核とな...