zoukankan      html  css  js  c++  java
  • 【LeetCode】98. 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.

    提示:

    这道题需要知道一个二叉搜索树的特性,就是一个二叉搜索数的中序遍历结果是一个严格单调递增序列。在知道了这个性质之后,就很好解了,这里我们给出非递归和递归两种解法。

    代码:

    非递归:

    /**
     * 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) {
                return true;
            }
            inOrder(root);
            for (int i = 1; i < v.size(); ++i) {
                if (v[i] <= v[i-1]) {
                    return false;
                }
            }
            return true;
        }
        
        void inOrder(TreeNode* node) {
            if (!node) {
                return;
            }
            inOrder(node->left);
            v.push_back(node->val);
            inOrder(node->right);
        }
        
    private:
        vector<int> v;
    };

    用了一个额外的vector存储中序遍历的结果,看上去好像不是太理想,再看一下递归方法:

    /**
     * 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) {
            TreeNode* pre = nullptr;
            return isValidBST(root, pre);
        }
        
        bool isValidBST(TreeNode *node, TreeNode*& pre) {
            if (!node) {
                return true;
            }
            if (!isValidBST(node->left, pre)) {
                return false;
            }
            if (pre && node->val <= pre->val) {
                return false;
            }
            pre = node;
            return isValidBST(node->right, pre);
        }
    };

    代码简单了很多,其实遍历的时候还是按照中序的思路来的,但是由于pre指针在函数间传递的过程当中指向的位置会发生改变,因此需要注意在函数参数那里需要将其写为指针的引用。

  • 相关阅读:
    SCILAB简介[z]
    UG OPEN API编程基础 2约定及编程初步
    Office 2003与Office 2010不能共存的解决方案
    UG OPEN API 编程基础 3用户界面接口
    NewtonRaphson method
    UG OPEN API编程基础 13MenuScript应用
    UG OPEN API编程基础 14API、UIStyler及MenuScript联合开发
    UG OPEN API编程基础 4部件文件的相关操作
    UG OPEN API编程基础 1概述
    16 UG Open的MFC应用
  • 原文地址:https://www.cnblogs.com/jdneo/p/5344989.html
Copyright © 2011-2022 走看看