1.二叉搜索树的简介
- 性质
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树;
- 右子树的结点的值一定大于等于左子树结点的值。
- 应用
- 插入一个数值
- 查询是否包含某个数值
- 删除某个数值
- 算法实现
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
}
};
第二种做法:把中序遍历的值存入数组,然后判断是否是升序的即可,由于算法效率较底不予实现。