トピックはLeetCodeからです
他のソリューションまたはソースコードにアクセスできます:tongji4m3
解説
バイナリツリーを指定して、それが有効なバイナリ検索ツリーであるかどうかを判断します。
二分探索木に以下の特性があると仮定します。
ノードの左側のサブツリーには、現在のノードより小さい数値のみが含まれています。
ノードの右側のサブツリーには、現在のノードより大きい数値のみが含まれています。
すべての左と右のサブツリーは、それ自体がバイナリ検索ツリーでなければなりません。
例1:
输入:
2
/ \
1 3
输出: true
例2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
アイデア
中間順序のトラバーサル。次のノードが前のノード以下の場合、二分探索木ではありません。
細部
isFirstを使用して、次の特別な状況でエラーを回避します。
左端がInteger.MIN_VALUEであるか、2つのInteger.MIN_VALUEがある場合
コード
public boolean isValidBST(TreeNode root)
{
Stack<TreeNode> stack=new Stack<>();
TreeNode temp = root;
boolean isFirst = true;
int pre=0;
while(temp!=null || !stack.isEmpty())
{
while(temp!=null)
{
stack.push(temp);
temp = temp.left;
}
temp = stack.pop();
if(isFirst)
{
pre = temp.val;
isFirst = false;
}
else if(temp.val<=pre)
{
return false;
}
pre = temp.val;
temp = temp.right;
}
return true;
}