この記事では、コーディング面接の前に学ぶべきコアアルゴリズムのいくつかをできるだけ詳しく説明したいと思います。 バイナリ検索木 (BST) とは何ですか?コーディング面接でよく見られる BST は、最上部にルートがあるツリーのようなデータ構造です。順序付けられた性質により高速な検索と参照が可能になるため、数値を保存するのに最適な方法です。 通常のツリーと比較して、BST には次の特性があります。
次の図を見ると、より明確になるはずです。 バイナリツリーノードの定義 通常、Javascript では次の関数を使用してバイナリ ツリー ノードを定義します。 関数 TreeNode(val, left, right) { this.val = val this.left = 左 this.right = 右 } バイナリツリーの基本的な走査(インオーダー、ポストオーダー、プレオーダー)まず、BST の各ノードをどのようにトラバースするかを知る必要があります。これにより、BST のすべてのノードで関数を実行できるようになります。たとえば、BST で値 x を見つけたい場合は、ノードが必要です。 これを行うには主に 3 つの方法があります。幸いなことに、それらは共通のテーマを共有しています。 順序通りの走査再帰アルゴリズムは、バイナリ ツリーの順序どおりのトラバーサルを開始するための最も簡単な方法です。考え方は次のとおりです。
Inorder アルゴリズムは、ツリー ノードを左、中央、右の順に走査します。 const inorder = (ルート) => { 定数ノード = [] if (ルート) { inorder(ルート.左) ノードをプッシュします(ルート.val) inorder(ルート.right) } ノードを返す } // この例のツリーでは、[1,2,3,4,5,6] が返されます 後順序トラバーサル再帰アルゴリズムは、後順序トラバーサルを開始する最も簡単な方法です。
後順トラバーサルは、ツリー ノードを左、右、中央から訪問します。 const postorder = (ルート) => { 定数ノード = [] if (ルート) { postorder(ルート.左) postorder(ルート.right) ノードをプッシュします(ルート.val) } ノードを返す } // この例のツリーでは、[1,3,2,6,5,4] が返されます 事前順序トラバーサル事前順序トラバーサルを開始する最も簡単な方法は、再帰アルゴリズムを使用することです。
後順トラバーサルは、ツリー ノードを中央、左、右から訪問します。 const preorder = (ルート) => { 定数ノード = [] if (ルート) { ノードをプッシュします(ルート.val) preorder(ルート.left) 事前注文(ルート.right) } ノードを返す } // この例のツリーでは、[4,2,1,3,5,6] が返されます 有効な二分探索木とは何ですか?有効なバイナリ検索ツリー (BST) には、値が親ノードより小さいすべての左の子と、値が親ノードより大きいすべての右の子が含まれます。
const isValidBST = (ルート) => { const ヘルパー = (ノード、最小値、最大値) => { if (!node) が true を返す node.val <= min || node.val >= max の場合、false を返します。 ヘルパー(node.left, min, node.val) && ヘルパー(node.right, node.val, max) を返します } ヘルパーを返します(ルート、Number.MIN_SAFE_INTEGER、Number.MAX_SAFE_INTEGER) } 二分木の最大深さを見つける方法ここで、アルゴリズムは BST の高さ/深さを見つけようとします。言い換えれば、BST にいくつの「レベル」が含まれているかを調べていることになります。
定数maxDepth = function(root) { const calc = (ノード) => { if (!node) が 0 を返す Math.max(1 + calc(node.left), 1 + calc(node.right)) を返します } calc(root)を返す }; 2つのツリーノード間の最小共通祖先を見つける方法難易度を上げてみましょう。バイナリツリー内の 2 つのツリーノード間の共通祖先をどのように見つけるのでしょうか?いくつか例を見てみましょう。 このツリーでは、3 と 1 の最小共通祖先は 2 です。3 と 2 の LCA は 2 です。6 と 1 と 6 の LCA は 4 です。 ここにパターンが見えますか? 2 つのツリー ノード間の LCA は、いずれかのノード自体 (ケース 3 および 2)、または最初の子が左のサブツリーのどこかにあり、2 番目の子が右のサブツリーのどこかにある親ノードのいずれかです。 2 つのツリー ノード p と q 間の最小共通祖先 (LCA) を見つけるアルゴリズムは次のとおりです。
const lowestCommonAncestor = function(root, p, q) { lca = null とします const isCommonPath = (ノード) => { if (!node) が false を返す var isLeft = isCommonPath(node.left) var isRight = isCommonPath(node.right) var isMid = ノード == p || ノード == q if (isMid && isLeft || isMid && isRight || isLeft && isRight) { lca = ノード } isLeft || isRight || isMid を返します } isCommonPath(ルート) リターンLCA }; 😊 終わりこれまで、BST の深さをトラバース、検証、計算する方法を学習しました。 これで、JavaScript 初心者向けのバイナリ サーチ ツリー アルゴリズム チュートリアルに関するこの記事は終了です。JavaScript バイナリ サーチ ツリー アルゴリズムに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: mysql8.0.20 のダウンロードとインストールおよび発生した問題 (図とテキスト)
>>: Alibaba Cloud ホストが IP を使用して Web サイトにアクセスできない問題の解決策 (セキュリティ グループ ルールを構成することで解決)
最近、IIS をサーバーとして使用すると、apk ファイルがサーバーにアップロードされましたが、ダウ...
HTML では、<、>、& などは特別な意味を持ち (<、> はリン...
この記事では、弾性ナビゲーション効果を実現するためのJavaScriptの具体的なコードを参考までに...
目次1. 終了2. クロージャの使用シナリオ1.タイムアウトを設定する2. コールバック3. 手ぶれ...
目次WXS レスポンス イベントプランAページ構造とスタイルWXS イベントコールバック関数WXS ...
目次序文フィルターとは何かフィルターの使い方グローバルフィルターローカルフィルターフィルターは直列に...
この記事では、フィルターを使用して日付をフォーマットするVueの具体的なコードを参考までに紹介します...
1 HTML入門1.1 初めてのコード体験、最初のウェブページの作成XML/HTML コードコンテン...
複数行を超えるテキストをインターセプトするための HTML コードは次のとおりです。 HTML:コー...
vsftpdをインストールする $ sudo apt-get install vsftpd -y v...
免責事項:プロジェクトでは ROS 環境を使用する必要があるため、これは Ubuntu 20.04 ...
MySQLパスワードは正しいが、ローカルでログインできない -1045 ユーザー 'roo...
困り果てて、ふと、私がよく行くSinaのタッチスクリーン版はどうやって作られているのだろう?と考えま...
Web 標準について議論するときに必ず話題になるのは、構造とプレゼンテーションを分離することの重要性...
この記事では、JavaScriptキャンバスでミラーイメージ効果を実現するための具体的なコードを参考...