版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wchenchen0/article/details/82777192
可以称为:排序二叉树,二叉搜索树,二叉排序树,二叉查找树
1.查找操作:普通二叉树无法确定具体性质,因此只能对左右子树都进行递归遍历。但是二叉查找树性质可以选择其中一个子树进 行遍历。
void search(tree bt, int x)
{
if (bt == NULL) {
cout << "fail" << endl;
return;
}
if (x == bt->data) cout << "find" << endl;
else if (x < bt->data) search(bt->L, x);
else if (x > bt->data) search(bt->R, x);
}
2.插入操作:二叉树结点插入位置就是数据域在二叉树中查找失败的位置(注意&)
void insert(tree &bt, int x)
{
if (bt == NULL) {
bt = new node;
bt->data = x;
bt->L = bt->R = NULL;
}
if (bt->data == x) return;
else if (x < bt->data) insert(bt->L, x);
else insert(bt->R, x);
}
3.二叉查找树的建立:一组相同的数字,如果插入它们的顺序不同,最后二叉查找树也可能不同,例如插入{5,3,7,4,2,8,6}与
{7,4,5,8,2,6,3};
tree bt = NULL;
void Greate(int s[], int n)
{
for (int i = 0;i < n;i++) {
insert(bt, s[i]);
}
}
4,二叉查找树的删除:
查找操作:
//寻找以root为根结点的树中的最大权值结点
tree findMax(tree root)
{
while (root->R != NULL) {
root = root->R;//不断往右,直到没有右孩子
}
return root;
}
//寻找以root为结点的树中的最小权值结点
tree findMin(tree root)
{
while (root->L != NULL) {
root = root->L;//不断往左,直到没有左儿子
}
return root;
}
删除操作:
void deleteNode(tree &bt, int x)
{
if (bt == NULL) return;//不存在权值为x的结点
if (bt->data == x) {//找到欲删除结点
if (bt->L == NULL && bt->R == NULL)//叶结点直接删除
bt = NULL;//把bt地址设为NULL,父节点就引用不到它了
else if (bt->L != NULL) {
tree pre = findMax(bt->L);//找到bt前驱
bt->data = pre->data;//用前驱覆盖bt
deleteNode(bt->L, pre->data);//在左子树中删除结点pre
}
else {
tree next = findMin(bt->R);//找到bt后驱
bt->data = next->data;//用后驱覆盖bt
deleteNode(bt->R, next->data);//在右子树中删除结点next
}
}
else if (x < bt->data) deleteNode(bt->L, x);//在左子树中删除x
else deleteNode(bt->R, x);//在右子树中删除x
}
完整代码:
#include<iostream>
using namespace std;
typedef struct node;
typedef node *tree;
struct node
{
int data;
tree L;
tree R;
};
int s[] = { 5,3,7,4,2,8,6 };
//寻找以root为根结点的树中的最大权值结点
tree findMax(tree root)
{
while (root->R != NULL) {
root = root->R;//不断往右,直到没有右孩子
}
return root;
}
//寻找以root为结点的树中的最小权值结点
tree findMin(tree root)
{
while (root->L != NULL) {
root = root->L;//不断往左,直到没有左儿子
}
return root;
}
//删除以bt为结点的树中权值为x的结点
void deleteNode(tree &bt, int x)
{
if (bt == NULL) return;//不存在权值为x的结点
if (bt->data == x) {//找到欲删除结点
if (bt->L == NULL && bt->R == NULL)//叶结点直接删除
bt = NULL;//把bt地址设为NULL,父节点就引用不到它了
else if (bt->L != NULL) {
tree pre = findMax(bt->L);//找到bt前驱
bt->data = pre->data;//用前驱覆盖bt
deleteNode(bt->L, pre->data);//在左子树中删除结点pre
}
else {
tree next = findMin(bt->R);//找到bt后驱
bt->data = next->data;//用后驱覆盖bt
deleteNode(bt->R, next->data);//在右子树中删除结点next
}
}
else if (x < bt->data) deleteNode(bt->L, x);//在左子树中删除x
else deleteNode(bt->R, x);//在右子树中删除x
}
void search(tree bt, int x)
{
if (bt == NULL) {
cout << "fail" << endl;
return;
}
if (x == bt->data) cout << "find" << endl;
else if (x < bt->data) search(bt->L, x);
else if (x > bt->data) search(bt->R, x);
}
void insert(tree &bt, int x)
{
if (bt == NULL) {
bt = new node;
bt->data = x;
bt->L = bt->R = NULL;
}
if (bt->data == x) return;
else if (x < bt->data) insert(bt->L, x);
else insert(bt->R, x);
}
tree bt = NULL;
void Greate(int s[], int n)
{
for (int i = 0;i < n;i++) {
insert(bt, s[i]);
}
}
void print(tree bt)
{
if (bt) {
cout << bt->data << endl;
print(bt->L);
print(bt->R);
}
}
int main()
{
Greate(s, 7);
//print(bt);
search(bt, 4);
search(bt, 1);
deleteNode(bt, 5);
cout << "dfasf" << endl;
print(bt);
return 0;
}