プログラマーインタビューゴールデンコード-インタビューの質問04.05。法的バイナリ検索ツリー

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;
    }
};

4つの問題解決の結果

おすすめ

転載: blog.csdn.net/qq_39661206/article/details/108055082