1.二叉排序树的相关操作
二叉排序树的相关操作可以分为这几种:
1.创建二叉排序树
2.插入值
3.查找值
4.删除值
首先给出二叉排序树的结点类型定义:(就是一个二叉树)
struct bis {
int data;
bis* left;
bis* right;
};
因为创建二叉排序树需要用到插入值的操作,所以我们一起说:
创建二叉排序树
输入:
9
38 45 42 24 58 30 67 12 51
根据输入数据的方法不同,可以更改创建二叉排序树里面的写法,我写的这个就是按照上面的:输入第一行给出一个正整数N
;第二行给出N
个互不相同的正整数,其间以空格分隔。
每输入一个数,我们就要进行一次插入操作。
bis* creat() {
bis* root = NULL;
int n;
cin >> n;
int temp;
for (int i = 0; i < n; i++) {
cin >> temp;
root = insert(root, temp);//每输入一个数,我们就要进行一次插入操作
}
return root;
}
插入值
这个函数的第一个参数是二叉排序树的根节点,第二个参数是待插入的数据
now指针用于遍历,pre指针指向now的前驱
我这个二叉排序树是左大右小的,一般是左小右大。
当now指针为NULL时,说明pre指向了叶节点,这时候便可以插入了。
bis* insert(bis* t, int k) {
bis* pre=NULL, *now;
now = t;
while (now) {
if (k == now->data) {
return t;
}
else {
pre = now;
if (k > now->data) {//这个二叉排序树是左大右小的,一般是左小右大
now = now->left;
}
else {
now = now->right;
}
}
}
bis* newnode = (bis*)malloc(sizeof(bis));
newnode->data = k;
newnode->left = NULL;
newnode->right = NULL;
if (!t) {
t = newnode;
}
else {
if (k > pre->data) {
pre->left = newnode;
}
else {
pre->right = newnode;
}
}
return t;
}
查找值
查找值的过程和插入值的过程差不多
迭代法:
bis* search(bis* t, int k) {
bis* temp = t;
while (temp) {
if (temp->data = k) {
return temp;
}
else if (k<temp->data) {//这个二叉排序树是左大右小的
temp = temp->right;
}
else {
temp = temp->left;
}
}
return NULL;
}
递归法:
bis* search2(bis* t, int k) {
if (t == NULL || t->data == k) {
return t;
}
else {
if (k < t->data) {//这个二叉排序树是左大右小的
return search2(t->right, k);
}
else {
return search2(t->left, k);
}
}
}
删除值
2.判断是否为完全二叉树
3.字符串find函数
1.find函数
语法
find(str,position)
-
str:待查找的字符串
-
position:字符串中的某个位置,表示从从这个位置开始的字符串中找指定元素(不填第二个参数,默认从字符串的开头进行查找)
返回值为目标字符的位置(第一个字符位置为0),当没有找到目标字符时返回-1
举例
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string message = "666acbd";
string s = "chi1 huo3 guo1";
string s2 = "ac";
int flag = message.find(s);
int flag2 = message.find(s2);
cout << flag << endl;
cout << flag2 << endl;
return 0;
}
2.find_first_of()
查找第一次出现的位置
find_last_of()
查找最后一次出现的位置
举例:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string message = "string666,int m=466,34566";
string s = "66";
int first = message.find_first_of(s);
int last = message.find_last_of(s);
cout << first << endl;
cout << last << endl;
return 0;
}
3.rfind()
反向查找第一次出现的位置
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string message = "string666,int m=466,34566";
string s = "66";
int k = message.rfind(s);
cout << k << endl;
return 0;
}
查找所有子串在母串中出现的位置
//查找s 中flag 出现的所有位置。
string s("hello world!");
string flag="l";
int position=0;
int i=1;
while((position=s.find(flag,position))!=string::npos)
{
cout<<"position "<<i<<" : "<<position<<endl;
position++;
i++;
}
position 1 : 2
position 2 : 3
position 3 : 9