一.基本算法
bool binary_search(vector<int> &arr,int target){//数组必须有序
int begin=0;//起点
int end=arr.size()-1;//终点
while(begin<=end){
int mid=(begin+end)/2;
if(arr[mid]==target) return true;
else if(arr[mid]<target) begin=mid+1;
else if(arr[mid]>target) end=mid-1;
}
return false;
}
二.二叉查找树
1.插入结点
void BST_insert(TreeNode *node,TreeNode *insert_node){
if(insert_node->val<node->val){//插入左子树
if(node->left)
BST_insert(node->left,insert_node);//左子树存在
else
node->left=insert_node;
}else{
if(node->right)
BST_insert(node->right,insert_node);//右子树存在
else
node->right=insert_node;
}
}
2.查找数值
bool BST_search(TreeNode *node,int value){
if(node->val==value){
return true;
}
if(value<node->val){//查找左子树
if(node->left) return BST_search(node->left,value);
else return false;
}else{//查找右子树
if(node->right) return BST_search(node->right,value);
else return false;
}
}
三.例题——验证二叉搜索树
思想:利用二叉排序树的中序遍历结果是一个升序数组
#include <iostream>
#include <queue>
#include <climits>
#include<cstdlib>
#include <cstring>
#include<map>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(NULL), right(NULL) {}
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
TreeNode* inputTree()
{
int n,count=0;
char item[100];
cin>>n;
if (n==0)
return NULL;
cin>>item;
TreeNode* root = new TreeNode(atoi(item));
count++;
queue<TreeNode*> nodeQueue;
nodeQueue.push(root);
while (count<n)
{
TreeNode* node = nodeQueue.front();
nodeQueue.pop();
cin>>item;
count++;
if (strcmp(item,"null")!=0)
{
int leftNumber = atoi(item);
node->left = new TreeNode(leftNumber);
nodeQueue.push(node->left);
}
if (count==n)
break;
cin>>item;
count++;
if (strcmp(item,"null")!=0)
{
int rightNumber = atoi(item);
node->right = new TreeNode(rightNumber);
nodeQueue.push(node->right);
}
}
return root;
}
class Solution{
public:
vector<int> vec;
void inorder(TreeNode *root){
if(!root) return;
inorder(root->left);
vec.push_back(root->val);
inorder(root->right);
}
bool isVaild(TreeNode *root){
inorder(root);
for(int i=1;i<vec.size();i++){
if(vec[i]<=vec[i-1]) return false;
}
return true;
}
};
int main()
{
TreeNode* root;
root=inputTree();
bool res=Solution().isValidBST(root);
cout<<(res?"true":"false")<<endl;
}