leetcode 98 验证二叉树

简介: leetcode 98 验证二叉树

验证二叉树


620854d7278d4b12a58e1d875da75f5e.png0341d2a5c9314a59a0c487eac81bae8b.png


双层递归(时间复杂度高)


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool result = true;
    //第一层递归判断是否是二叉搜索树
    void judge_tree(TreeNode* cur )
    {   
        if(cur==nullptr) return;
        if (cur->left!=nullptr ) Traversal(cur->left , cur->val ,1);
        if (cur->right!=nullptr ) Traversal(cur->right , cur->val ,2);
        judge_tree(cur->left );
        judge_tree(cur->right );
    }
    //第二层递归判断左右子树是不是都小于自己或都大于自己
    void Traversal(TreeNode* cur , int root_val , int flag) 
    {
        if(cur==nullptr) return;
        if(flag == 1)
        {
            if(cur->val >= root_val) result=false;
        }
         if(flag == 2)
        {
            if(cur->val <= root_val) result=false;
        }
        Traversal(cur->left , root_val , flag);
        Traversal(cur->right , root_val ,flag);
    }
    bool isValidBST(TreeNode* root) {
        if(root == nullptr) return false;
        judge_tree(root );
        return  result; 
    }
};

单层递归

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
  //记录上一个点
    TreeNode* pre = nullptr;
    bool judge_tree(TreeNode* cur)
    {
        if(cur==nullptr) return true;
        bool left_val =  judge_tree(cur->left);
        //当前点应该比上一个大,如果小发生错误
        if(pre != nullptr && cur->val <= pre->val) return false;
        //更新当前点
        pre = cur;
        bool right_val = judge_tree(cur->right);
        return left_val&right_val;
    }
    bool isValidBST(TreeNode* root) {
        if(root==nullptr) return true;
        return judge_tree(root);
    }
};

二刷

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    long pre_num = LONG_MIN;
    bool result = true;
    bool track_back(TreeNode* cur)
    {
        if(cur == nullptr ) return result;
        bool left_falg = track_back(cur->left);
        if(cur->val <= pre_num ) result = false;
        pre_num = cur->val;
        bool  right_flag = track_back(cur->right);
        return result;
    }
    bool isValidBST(TreeNode* root) {
        if(root == nullptr  ) return true;
        else if(root->left==nullptr && root->right == nullptr) return true;
        return track_back(root);
    }
};
相关文章
|
19天前
leetcode代码记录(二叉树的所有路径
leetcode代码记录(二叉树的所有路径
13 0
|
7天前
【力扣刷题】二叉树的中序遍历、二叉树的最大深度、翻转二叉树、对称二叉树
【力扣刷题】二叉树的中序遍历、二叉树的最大深度、翻转二叉树、对称二叉树
14 0
|
10天前
|
存储 Java
JAVA数据结构刷题 -- 力扣二叉树
JAVA数据结构刷题 -- 力扣二叉树
16 0
|
11天前
[LeetCode]—— 226——翻转二叉树
[LeetCode]—— 226——翻转二叉树
|
11天前
[LeetCode]——965——单值二叉树
[LeetCode]——965——单值二叉树
|
11天前
LeetCode——101——对称二叉树
LeetCode——101——对称二叉树
35 12
|
11天前
|
存储
LeetCode———144—— 二叉树的前序遍历
LeetCode———144—— 二叉树的前序遍历
|
11天前
LeetCode——965. 单值二叉树
LeetCode——965. 单值二叉树
|
13天前
|
算法
数据结构与算法⑮(第四章_下)二叉树OJ(力扣:144,965,104,110,226,100,101,572)(下)
数据结构与算法⑮(第四章_下)二叉树OJ(力扣:144,965,104,110,226,100,101,572)
7 1
|
13天前
|
算法 C++
数据结构与算法⑮(第四章_下)二叉树OJ(力扣:144,965,104,110,226,100,101,572)(上)
数据结构与算法⑮(第四章_下)二叉树OJ(力扣:144,965,104,110,226,100,101,572)
7 1