blog

バイナリ木 - バイナリ探索木の検証

2進木が与えられたとき、それが有効な2進探索木かどうかを判定しなさい。\nバイナリ探索木が以下の特徴を持つとします:\n\n入力\n 2\n / \\n 1 3\n出力:真\n例 2.\n入力\n 5...

Dec 9, 2020 · 2 min. read
シェア

2進木が与えられたとき、それが有効な2進探索木かどうかを判定します。

2進探索木が次のような特徴を持つとします:

ノードの左サブツリーには、現在のノードより小さい数値のみが含まれます。ノードの右サブツリーには、現在のノードより大きい数値のみが含まれます。すべての左サブツリーと右サブツリーもバイナリ探索木そのものでなければなりません。例 1.

 :
 2
 / 
 1 3
 : true
例2:
 :
 5
 / 
 1 4
 / 
 3 6
 : false
 :  : [5,1,4,null,null,3,6] 
 ルート・ノードの値は5であるが、その右の子ノードの値は4である。
  • 最初のプレノードとして使用される最小値を初期化します。
  • 中順序トラバーサルのルールに従って、左端の子ノードからトラバーサルを開始し、左のサブツリーを訪問し、再帰的に最後の左のサブツリーノードまで訪問します。
  • 値が前のノードの値より大きいかどうかを判断し、大きくない場合はfalseを返します。
  • 右サブツリーに再帰的にアクセス、右サブツリーには左サブツリーがあり、最初に左端の子ノードに移動して探索開始

複雑さの解析

時間の複雑さ O(N): すべてのツリーノードがトラバースされるので、時間の複雑さはN。

空間の複雑さ O(1): 最悪の場合、バイナリツリーは連鎖テーブルに縮退し、システムはO(N)サイズのスタック空間を使用します。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 * int val;
 * TreeNode left;
 * TreeNode right;
 * TreeNode(int x) { val = x; }
 * }
 */
 //中位のトラバーサルの原理を用いると、トラバースされたすべてのノードは前のノードの値より大きくなる。
class Solution {
 //最初の点として使われる最小値を初期化する。実際、最初のトラバーサルで判定を行うのはどうだろうか。
 long pre = Long.MIN_VALUE;
 public boolean isValidBST(TreeNode root) {
 //ノードが空の場合、直接真を返す。
 if(root == null) return true;
 
 //左の部分木にアクセスし、再帰的に最後の左の部分木のノードに到達する。
 if(!isValidBST(root.left)){
 return false;
 }
 
 //前のノードの値より大きいかどうかを判断し、大きくない場合はfalseを返す。
 if(pre >= root.val) return false;
 pre = root.val;
 
 //右部分木へのアクセス
 return isValidBST(root.right);
 
 }
}
Read next

Java - JVM

システムは主に3つのステップでクラスタイプのファイルをロードします。接続プロセスは、次の3つのステップに分けることができます。 仮想マシンが定数プール内のシンボリック参照を直接参照に置き換えるプロセス、つまり、メモリ内のクラスまたはフィールドまたはメソッドへのポインタまたはオフセットを取得します。 クラスで定義されたjavaプログラムコードの実際の実行は、初期化がクラスのコンストラクタ()パーティ...

Dec 9, 2020 · 2 min read