leetcode笔记—判断查找二叉树

首先说明一下二叉树和二叉搜索树的区别。二叉树指这样的树结构,它的每个结点的孩子数目最多为2个;二叉搜索树是一种二叉树,但是它有附加的一些约束条件,这些约束条件必须对每个结点都成立:
  • 结点node的左子树所有结点的值都小于node的值。
  • 结点node的右子树所有结点的值都大于node的值。
  • 结点node的左右子树同样都必须是二叉搜索树。

假定当前结点值为k。对于二叉树中每个结点,判断其左孩子的值是否小于k,其右孩子的值是否大于k。如果所有结点都满足该条件,则该二叉树是一棵二叉搜索树。如果按这个定义的算法,会出现错误。

    10
   /  \
  5   15     -------- binary tree (1)
     /  \
    6    20
以上满足代码但不是查找二叉树,因此需要判断所有左节点是否都小于根节点,所有右节点是否都大于根节点。

/**
 * 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;
  return isSubTreeLessThan(root->left, root->val) &&
         isSubTreeGreaterThan(root->right, root->val) &&
         isValidBST(root->left) &&
         isValidBST(root->right);
    }
   bool isSubTreeLessThan(TreeNode *p, int val) 
{
  if (!p) return true;
  return (p->val < val &&
          isSubTreeLessThan(p->left, val) &&
          isSubTreeLessThan(p->right, val));
}
 /*判断右子树的结点值是否都大于val*/
bool isSubTreeGreaterThan(TreeNode *p, int val) 
{
  if (!p) return true;
  return (p->val > val &&
          isSubTreeGreaterThan(p->left, val) &&
          isSubTreeGreaterThan(p->right, val));
}
 
};


你可能感兴趣的:(leetcode笔记—判断查找二叉树)