zoukankan      html  css  js  c++  java
  • [LeetCode] Validate Binary Search Tree

    Validate Binary Search Tree

    Given a binary tree, determine if it is a valid binary search tree (BST).

    Assume a BST is defined as follows:

    • The left subtree of a node contains only nodes with keys less than the node's key.
    • The right subtree of a node contains only nodes with keys greater than the node's key.
    • Both the left and right subtrees must also be binary search trees.

    confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

    解题思路:

    (1)空二叉树是BST

    (2)若根节点R值大于左子树的最大值。且小于右子树最小值,而且左右子树都是BST。那么以R为根的树也是BST

    因此代码例如以下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isValidBST(TreeNode* root) {
            if(root == NULL){
                return true;
            }
            TreeNode* leftMaxNode = getMaxNode(root->left);
            TreeNode* rightMinNode = getMinNode(root->right);
            if(leftMaxNode!=NULL && leftMaxNode->val >= root->val){
                return false;
            }
            if(rightMinNode!=NULL && rightMinNode->val <= root->val){
                return false;
            }
            return isValidBST(root->left) && isValidBST(root->right);
        }
        
        TreeNode* getMaxNode(TreeNode* root){
            if(root == NULL){
                return NULL;
            }
            TreeNode* maxNode = root;
            TreeNode* leftMaxNode = getMaxNode(root->left);
            TreeNode* rightMaxNode = getMaxNode(root->right);
            if(leftMaxNode!=NULL && leftMaxNode->val > maxNode->val){
                maxNode = leftMaxNode;
            }
            if(rightMaxNode!=NULL && rightMaxNode->val > maxNode->val){
                maxNode = rightMaxNode;
            }
            return maxNode;
        }
        
        TreeNode* getMinNode(TreeNode* root){
            if(root == NULL){
                return NULL;
            }
            TreeNode* minNode = root;
            TreeNode* leftMinNode = getMinNode(root->left);
            TreeNode* rightMinNode = getMinNode(root->right);
            if(leftMinNode!=NULL && leftMinNode->val < minNode->val){
                minNode = leftMinNode;
            }
            if(rightMinNode!=NULL && rightMinNode->val < minNode->val){
                minNode = rightMinNode;
            }
            return minNode;
        }
    };


  • 相关阅读:
    删除链表的倒数第N个节点
    SVN快速入门(TSVN)
    C# HttpWebRequest提交数据方式浅析
    简单的3个SQL视图搞定所有SqlServer数据库字典
    简单统计SQLSERVER用户数据表大小(包括记录总数和空间占用情况)
    详细讲解Android对自己的应用代码进行混淆加密防止反编译
    PHP之网络编程
    PHP之ThinkPHP模板标签操作
    PHP之ThinkPHP数据操作CURD
    关于数组的取极值和排序
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7181927.html
Copyright © 2011-2022 走看看