それは有効な二分探索木であるかどうかを判断するために、バイナリツリーを考えます。
バイナリ検索ツリーは、以下の特性を有すると仮定します。
木の左の子ノードは、現在のノードの数よりも少ないのみが含まれています。
右のサブツリーは、現在のノードのノード数よりも大きいだけ含まれています。
すべての左部分木と右部分木自体も二分探索木でなければなりません。
例1:
入力:
2
/ \
1 3
出力:真
例2:
入力:
5
/ \
14
/ \
36
出力:偽
の解釈:入力として:[5,1,4、NULL、NULL、 3,6]。
図5は、ルートノードであるが、それは右の子ノード4です。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
static void DFS(struct TreeNode* root,bool *ret,int min,int max,unsigned char flag)
{
if(!(*ret)||!root)return;
if(flag==1)
{//左子树
if(root->val>=max)*ret=false;
DFS(root->left,ret,0,root->val,1);
DFS(root->right,ret,root->val,max,0);
}
else if(flag==2)
{//右子树
if(root->val<=min)*ret=false;
DFS(root->left,ret,min,root->val,0);
DFS(root->right,ret,root->val,0,2);
}
else
{
if(root->val>=max||root->val<=min)*ret=false;
DFS(root->left,ret,min,root->val,0);
DFS(root->right,ret,root->val,max,0);
}
}
bool isValidBST(struct TreeNode* root){
if(!root)return true;
bool ret=true;
DFS(root->left,&ret,0,root->val,1);
DFS(root->right,&ret,root->val,0,2);
//printf("%d \n",ret);
return ret;
}
実行時:24ミリ秒は、Cの提出にユーザーを検証バイナリ検索ツリーの69.71パーセントを打ちます
メモリ消費量:10メガバイトは、Cの提出にユーザーを検証バイナリ検索ツリーの100.00パーセントを破りました