バイナリ検索ツリーの検証: インターネット上の古典的なアルゴリズム

バイナリ検索ツリーの検証: インターネット上の古典的なアルゴリズム

[[427951]]

この記事はWeChatの公開アカウント「Programmer Bear」から転載したもので、著者はDineです。この記事を転載する場合は、プログラマーXiaoxiongの公式アカウントまでご連絡ください。

序文

みなさんこんにちは。私はHuaweiのプログラマー、Xiao Xiongです。今日は、バイナリツリーに関連する高頻度の面接の質問を紹介します。この質問は、過去6か月間にGoogle、ByteDance、Microsoft、Amazonなどの大手企業で面接の質問として使用されました。それは、Likouの質問98 - バイナリ検索ツリーの検証です。

この記事では、主にこの問題を解決するための再帰と深さ優先探索の 2 つの方法を紹介します。参考になれば幸いです。

二分探索木の検証

バイナリ ツリーのルートが与えられた場合、それが有効なバイナリ検索ツリーであるかどうかを判断します。

有効な二分探索木は次のように定義されます。

ノードの左のサブツリーには、現在のノードより小さい数値のみが含まれます。

ノードの右サブツリーには、現在のノードより大きい数値のみが含まれます。

すべての左および右のサブツリー自体もバイナリ検索ツリーである必要があります。

例1

例2とヒント

二分探索木

タイトルは、有効な二分探索木の定義が次のようになることを示唆しています。

  • ノードの左のサブツリーには、現在のノードより小さい数値のみが含まれます。
  • ノードの右サブツリーには、現在のノードより大きい数値のみが含まれます。
  • すべての左および右のサブツリー自体もバイナリ検索ツリーである必要があります。

例1

例1

例2

例3

二分探索木の判定

上記の例の場合、二分探索木の判定方法によれば、上記の例が二分探索木であるかどうかは以下のように判定されます。

  • 例 1 は二分探索木ではありません。理由: ルート ノード (値 6) の左サブツリー内のノード数 (値 7) がルート ノードの数より大きくなっています。
  • 例 2 は二分探索木ではありません。理由: ルート ノード (値 6) の右サブツリー内のノード数 (値 3) がルート ノードの数より少なくなっています。
  • 例 3 は二分探索木ではありません。理由: ルート ノードの左サブツリーは二分探索木ではありません。左サブツリーのルート ノードの値 5 は、左子ノードの値 7 よりも小さいだけでなく、右子ノードの値 4 よりも大きくなっています。さらに、ルート ノードの値 6 は、左サブツリーのノードの値 7 よりも小さくなっています。ルート ノードの右サブツリーも二分探索木ではありません。右サブツリーのルート ノードの値 8 は、右子ノードの値 3 よりも大きいだけでなく、左子ノードの値 9 よりも小さくなっています。さらに、ルート ノードの値 6 は、右サブツリーのノードの値 3 よりも大きくなっています。

問題解決

二分探索木の定義によれば、木が二分探索木であるかどうかを判断するには、各ノードが二分木の特性を満たしているかどうかを判断する必要があり、判断の根拠は同じであるため、再帰的な方法を使用してこの問題を解決できます。

再帰

上記の判断の根拠(現在のノードに左と右の子ノードがあると仮定)は次のとおりです。

  1. 現在のノードの値が、その左の子の値よりも大きい。
  2. 現在のノードの値が、その右の子ノードの値よりも小さい。
  3. 現在のノードに左サブツリーと右サブツリーがある場合、その左サブツリーと右サブツリーのノードも次の条件を満たす必要があります。左サブツリーのノード値は現在のノードの値より小さく、右サブツリーのノード値は現在のノードの値より大きい。

上記の考え方に基づいて、上限と下限を設定することで、ノードがバイナリ検索ツリーの特性を満たしているかどうかを判断できます。

上限と下限がある場合は、ノードが境界内にあるかどうかを判断します。境界内にない場合は、バイナリ検索ツリーではありません。境界内にない場合は、ノードの値を上限として使用し、左のサブツリーを再帰的に決定します。ノードの値を下限として使用し、右のサブツリーを再帰的に決定します。

知らせ

空の木は二分探索木です。

コードを見せてください

  1. bool isValidBST_Helper(構造体 TreeNode* ルート、 double  最小 最大){
  2. /* 特別判定 */
  3. ルート == NULLの場合{
  4. 戻る 真実;
  5. }
  6.  
  7. /* 現在のノードは上限と下限の範囲内にありません。バイナリ検索ツリーではありません */
  8. ルート->val <=最小|| ルート->val >=最大) {
  9. 戻る 間違い;
  10. }
  11.  
  12. /* 左と右のサブツリーが二分探索木であるかどうかを判定する */
  13. isValidBST_Helper(root-> left , min , root->val) && isValidBST_Helper(root-> right , root->val, max )を返します
  14. }
  15.  
  16. bool isValidBST(構造体TreeNode*ルート) {
  17. isValidBST_Helper(root, LONG_MIN, LONG_MAX) を返します
  18. }

C++

  1. bool isValidBST_Helper(TreeNode* ルート、 double  最小 最大){
  2. ルート == nullptr の場合 {
  3. 戻る 真実;
  4. }
  5.  
  6. (ルート->val <=最小|| ルート->val >=最大){
  7. 戻る 間違い;
  8. }
  9.  
  10. isValidBST_Helper(root-> left , min , root->val) && isValidBST_Helper(root-> right , root->val, max )を返します
  11. }
  12.  
  13. ブール isValidBST(TreeNode* ルート) {
  14. isValidBST_Helper(root, LONG_MIN, LONG_MAX) を返します
  15. }

ジャワ

  1. ブール値 isValidBST_Helper(TreeNode ルート、 double  最小 最大){
  2. ルートがnull場合
  3. 戻る 真実;
  4. }
  5.  
  6. (root.val <= min || root.val >= max ) の場合 {
  7. 戻る 間違い;
  8. }
  9.  
  10. isValidBST_Helper(root.left , min , root.val) && isValidBST_Helper(root.right , root.val, max )を返します
  11. }
  12.  
  13. ブール値 isValidBST(TreeNode ルート) {
  14. isValidBST_Helper(ルート、Long.MIN_VALUE、Long.MAX_VALUE)を返します
  15. }

Python3

  1. def isValidBST(self, ルート: TreeNode) -> bool:
  2. isValidBST_Helperを定義します(ルート、最小値):
  3. ルートNoneの場合:
  4. 戻る 真実 
  5.          
  6. root.val <= minの場合 またはroot.val >= right :
  7. 戻る 間違い 
  8.  
  9. isValidBST_Helper(root.left , min , root.val)isValidBST_Helper ( root.right , root.val, right )を返します
  10.  
  11. isValidBST_Helper(root, - float ( 'inf' ), float ( 'inf' ))を返します

Go言語

  1. func isValidBST(root *TreeNode) ブール値 {
  2. isValidBST_Helper(root, math.MinInt64, math.MaxInt64)を返します
  3. }
  4.  
  5. func isValidBST_Helper(root *TreeNode,最小値,最大値 整数)ブール{
  6. ルート == nilの場合{
  7. 戻る 真実 
  8. }
  9.  
  10. min >= root.Val || max <= root.Val {の場合
  11. 戻る 間違い 
  12. }
  13.  
  14. isValidBST_Helper(root.Left , min , root.Val)を返します&& isValidBST_Helper ( root.Right , root.Val, max )
  15. }

複雑性分析

時間計算量: O(n)、ここで n はバイナリ ツリー ノードの数です。

空間計算量: O(n)。

深さ優先探索

バイナリ検索木の特性によれば、バイナリ検索木に対して順序どおりのトラバーサルを実行すると、結果の配列は昇順になる必要があります。したがって、この特徴に基づいて、ツリーが二分探索ツリーであるかどうかを判断できます。

インオーダートラバーサルを使用する場合、バイナリツリーのすべてのノードの値を配列に格納し、配列が昇順になっているかどうかを判断します。手順は少し面倒です。

配列が昇順になっているかどうかを判断するには、配列の次の要素が前の要素より大きいかどうかを判断するだけで済みます。したがって、順序どおりにトラバーサルするときに前のノードの値を保存する変数を設定し、現在のノードの値が変数によって保存された値より大きいかどうかを判断できます。

大きくない場合は、ツリーがバイナリ検索ツリーではないことを意味します。それ以外の場合は、トラバースと判断を続けます。

コードを見せてください

C++

  1. ロングプレ = LONG_MIN;
  2. ブール isValidBST(TreeNode* ルート) {
  3. ルート == nullptr の場合 {
  4. 戻る 真実;
  5. }
  6.  
  7. if (!isValidBST(root-> left )) {
  8. 戻る 間違い;
  9. }
  10.  
  11. ルート>val <= preの場合{
  12. 戻る 間違い;
  13. }
  14.  
  15. pre = ルート->val;
  16. isValidBST(root-> right )を返します
  17. }

ジャワ

  1. 長いtemp = Long.MIN_VALUE;
  2. ブール値 isValidBST(TreeNode ルート) {
  3. ルートがnull場合
  4. 戻る 真実;
  5. }
  6.  
  7. if(!isValidBST( root.left )) {
  8. 戻る 間違い;
  9. }
  10.  
  11. (root.val <= temp )の場合{
  12. 戻る 間違い;
  13. }
  14.  
  15. temp = ルート.val;
  16. isValidBST ( root.right )を返します
  17. }

複雑性分析

時間計算量: O(n)、ここで n はバイナリ ツリー ノードの数です。

空間計算量: O(n)。

<<:  人工知能の時代において、ロボットを超える子どもたちが身につけるべき能力とは何でしょうか?

>>:  2050年の世界はどのようになっているでしょうか?新たなエネルギー源が出現し、人工知能が社会に浸透

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

5G自動運転はどのようなものになるのでしょうか?韓国のテストではこの結果が出た

自動運転と5Gの産業発展は大きな注目を集めており、韓国企業は最近、両者を組み合わせた効果を模索してい...

ディープラーニングのための 5 つのニューラル ネットワーク モデルとその応用

[[349567]] [51CTO.com クイック翻訳] ニューラル ネットワークは、一連のデータ...

ディープラーニングの仕組み: 今日の AI を支えるニューラル ネットワークの内部を覗いてみよう

[[428985]] [51CTO.com クイック翻訳]今日の人工知能の繁栄は、人工ニューラルネッ...

テキストマイニングの詳細: ツール、タスク、問題、解決策

[51CTO.com クイック翻訳] 現在、世界中のあらゆる場所で大量のデータが絶えず生成されており...

AIが高度な数学の核心を突破、微分方程式と不定積分を1秒以内に解き、その性能はMatlabをはるかに上回る

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

...

2021年6月の人工知能分野における重要な進展の概要

人工知能は、人間の理論、方法、技術、アプリケーション システムをシミュレート、拡張、拡大するために使...

製造業に人工知能を適用するにはどうすればよいでしょうか?

現在、製造企業で使用されている人工知能技術は、主にインテリジェント音声対話製品、顔認識、画像認識、画...

この「アンケート」で初めて AI が人間を上回る、Microsoft が SuperGLUE でトップ

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

...

自動化によって、採用担当者が大規模な適格な人材を特定する方法

AI ベースの自動化ツールは、候補者データを収集して処理し、候補者の調達、スクリーニング、多様性、そ...

リカレントニューラルネットワークの父:未来のロボットはアリを見るように人間を見るだろう

4月19日、ガーディアン紙は、ロボットの将来について語ったインタビューで、再帰型ニューラルネットワー...

12 の主要な AI ホットテクノロジーの方向性を網羅する、AISummit グローバル人工知能テクノロジーカンファレンス 2022 が開催されます。

人工知能は、60年以上にわたる発展の中で、数々の浮き沈みを経験してきました。近年、モバイルインターネ...

新しい「心を読む」システムにより、音声合成が実際の人間の声に近づく

メディアCNETによると、新しい技術は脳の活動の大部分を合成音声に変換することができ、それによって話...

ロボットが2000万の仕事に取って代わる:最大の懸念は30代なのに何も知らないこと

[[269741]] 01 数日前、あるニュースが私の周りの多くの人々に反省と心配を抱かせました。 ...