LeetCode刷题第一题------判断一个二叉树是不是二叉搜索树

1.二叉搜索树的简介

  • 性质

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树

  1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 它的左、右子树也分别为二叉排序树;
  4. 右子树的结点的值一定大于等于左子树结点的值。
  • 应用
  1. 插入一个数值
  2. 查询是否包含某个数值
  3. 删除某个数值
  • 算法实现

     1.查找:递归查找是否存在key。

     2.插入:原树中不存在key,插入key返回true,否则返回false。

     3.构造:循环的插入操作。

     4.删除:

              (1)叶子节点:直接删除,不影响原树。

              (2)仅仅有左或右子树的节点:节点删除后,将它的左子树或右子树整个移动到删除节点的位置就可以,子承父业。

              (3)既有左又有右子树的节点:找到须要删除的节点p的直接前驱或者直接后继s,用s来替换节点p,然后再删除节点s

2.LeetCode题目介绍

3.题目解法及解析

第一种做法:中序遍历递归

/**
 * 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:
    int* last=NULL;//用于存储中序遍历遍历的上一个的值
    bool isValidBST(TreeNode* root) {
        if(root){
            if(!isValidBST(root->left)) return false;//如果左子树不是二叉排序树返回false
            if(last&&*last>=root->val) return false;//如果当前点的值小于上一个中序遍历的值则返回false
            last = &root->val;//重置中值遍历的值
            if(!isValidBST(root->right)) return false;//如果右子树不是二叉排序树返回false
            return true;
        }else return true;//空树返回true

    }
};

第二种做法:把中序遍历的值存入数组,然后判断是否是升序的即可,由于算法效率较底不予实现。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章