1.トピックの紹介
バイナリツリーがバイナリ検索ツリーであるかどうかを確認する関数を実装します。
例1:
入力:
2
/ \
1 3
出力:true
例2:
入力:
5
/ \
1 4
/ \
3 6
出力:false
説明:入力は:[5,1,4、null、null、3,6] 。
ルートノードの値は5ですが、その右側の子ノードの値は4です。
出典:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/legal-binary-search-tree-lcci
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2つの問題解決のアイデア
バイナリ検索ツリーの特性である中次トラバーサルは、一連の昇順シーケンスを取得できます。つまり、最初にトラバースされたノードは、後でトラバースされたノードよりも小さくなります。この質問では、バイナリツリーの中次トラバーサルを調べます。
3つの問題解決コード
1.再帰的方法
class Solution {
private:
long val;
bool flag;
public:
//二叉搜索树的特点:中序遍历时为有序的
bool isValidBST(TreeNode* root) {
val = LONG_MIN;
flag = true;
dfs(root);
return flag;
}
void dfs(TreeNode* root)
{
if(!root || !flag)
{
return;
}
dfs(root->left);
if(root->val > val)
{
val = root->val;
}
else
{
flag = false;
return;
}
dfs(root->right);
}
};
2.非再帰的方法
class Solution {
public:
//二叉搜索树的特点:中序遍历时为有序的,即后遍历到的节点大于先遍历到的节点
bool isValidBST(TreeNode* root) {
if(!root)
return true;
stack<TreeNode*> st;
TreeNode* pNode = NULL;
while(!st.empty() || root)
{
while(root)
{
st.push(root);
root = root->left;
}
root = st.top();
st.pop();
if(pNode && pNode->val >= root->val)
return false;
pNode= root;
root = root->right;
}
return true;
}
};