leetcode || 98、Validate Binary Search Tree

本文讨论如何通过递归和中序遍历来判断一棵二叉树是否满足搜索二叉树的条件,即左子树所有节点小于根节点,右子树所有节点大于根节点,并给出正确的实现代码。

problem:

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.

Hide Tags
  Tree Depth-first Search
题意:判断一颗二叉树是否为搜索二叉树,注意搜索二叉树的性质:左子树的所有节点小于父节点,
右子树的所有节点大于父节点

thinking:

(1)开始试着用递归写了一个程序,对搜索二叉树的定义曲解了。仅仅比较了左孩子和右孩子。是错的。

class Solution {
public:
    bool isValidBST(TreeNode *root) {
        if(root==NULL)
            return true;
        TreeNode *parent = root;
        TreeNode *left_child=parent->left;
        TreeNode *right_child=parent->right;
        bool r=true;
        bool l=true; 
        if(left_child!=NULL)
        {
            if(left_child->val<parent->val)
                l=isValidBST(left_child);
            else
                l=false;
        }
        if(right_child!=NULL)
        {
            if(right_child->val>parent->val)
                r=isValidBST(right_child);
            else
                r=false;
        }
        return l&&r;      
    }
};

(2)正确解法是:中序遍历。采用DFS(非递归法)中序遍历二叉树,节点的VAL 应该是一个递增序列。

code:

class Solution {
  public:
      bool isValidBST(TreeNode *root)
      {
        vector<int> ret=inorderTraversal(root);
        int n=ret.size();
        if(n<2)
            return true;
        for(int i=1;i<n;i++)
        {
            if(ret[i]<=ret[i-1])
                return false;
        }
        return true;
      }
  protected:
      vector<int> inorderTraversal(TreeNode *root) {  
                 vector<int> ret;  
                 stack<TreeNode*> _stack;  
                 TreeNode *tmp=root;  
                 while(tmp!=NULL || !_stack.empty())  
                 {  
                     if(tmp!=NULL)  
                     {  
                         _stack.push(tmp);  
                         tmp=tmp->left;  
                     }  
                     else  
                     {  
                         tmp=_stack.top();  
                         _stack.pop();  
                         ret.push_back(tmp->val);  
                         tmp=tmp->right;  
                     }  
                 }  
               return ret;     
          }  
  };


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值