希赛考试网
首页 > 软考 > 软件设计师

二叉排序树的定义及查找

希赛网 2024-01-30 12:26:44

二叉排序树,又称二叉查找树,是一种特殊的二叉树。它具有以下几个特点:

1.所有节点都比它的左子树上的节点大,比它的右子树上的节点小;

2.任意一个节点左子树和右子树都是二叉排序树;

3.没有键值相等的节点。

因此,二叉排序树可以帮助我们高效地查找数据,同时也可以对数据进行排序。在此文章中,我们将从定义、插入、删除、查找和应用方面来详细分析二叉排序树。

定义

根据上述特点,我们可以得到一个节点的定义:

```C++

struct node

{

int data; //节点中存储的数据

struct node *left; //指向左子节点的指针

struct node *right; //指向右子节点的指针

};

```

插入

向二叉排序树中插入一个节点,需要遵循以下基本步骤:

1.若根节点为空,当前节点为根节点;

2.若插入节点的数据小于根节点的数据,在左子树中插入节点;

3.若插入节点的数据大于根节点的数据,在右子树中插入节点。

代码实现如下:

```C++

struct node *insert(struct node *node, int data)

{

if(node == nullptr) //如果根节点为空

{

struct node *temp = (struct node*)malloc(sizeof(struct node)); //创建新节点

temp->data = data; //存储数据

temp->left = nullptr;

temp->right = nullptr;

return temp; //返回该节点

}

if(data < node->data) //如果数据小于根节点

{

node->left = insert(node->left, data); //在左子树中插入节点

}

else if(data > node->data) //如果数据大于根节点

{

node->right = insert(node->right, data); //在右子树中插入节点

}

return node; //返回该节点

}

```

删除

在二叉排序树中删除一个节点,同样需要遵循以下基本步骤:

1.搜索要删除的节点;

2.如果节点是一片叶子,则直接删除;

3.如果节点有一个子节点,将该节点的子节点代替该节点;

4.如果节点有两个子节点,找到该节点右子树中的最小节点,将其数据复制到该节点中,然后删除该最小节点。

代码实现如下:

```C++

struct node *deleteNode(struct node *root, int key)

{

if(root == nullptr) //如果根节点为空

{

return root;

}

if(key < root->data) //如果查找节点的数据小于根节点

{

root->left = deleteNode(root->left, key); //在左子树中删除节点

}

else if(key > root->data) //如果查找节点的数据大于根节点

{

root->right = deleteNode(root->right, key); //在右子树中删除节点

}

else //如果查找节点的数据等于根节点

{

if(root->left == nullptr && root->right == nullptr) //叶节点

{

free(root); //直接删除

root = nullptr;

return root;

}

else if(root->left == nullptr) //只有右子节点

{

struct node *temp = root;

root = root->right;

free(temp);

return root;

}

else if(root->right == nullptr) //只有左子节点

{

struct node *temp = root;

root = root->left;

free(temp);

return root;

}

else //有两个子节点

{

struct node *temp = findMin(root->right);

root->data = temp->data;

root->right = deleteNode(root->right, temp->data);

}

}

return root;

}

```

查找

在二叉排序树中查找一个节点,同样需要遵循以下基本步骤:

1.从根节点开始遍历;

2.比较查找节点的数据与当前节点的数据,如果相等则返回该节点,否则继续遍历它的左子树或右子树。

代码实现如下:

```C++

struct node *search(struct node *root, int key)

{

if(root == nullptr || root->data == key) //如果根节点为空或者根节点的数据等于查找节点的数据

{

return root;

}

if(root->data < key) //如果根节点的数据小于查找节点的数据

{

return search(root->right, key); //在右子树中查找

}

return search(root->left, key); //在左子树中查找

}

```

应用

二叉排序树在实际应用中有很多用处。例如,它可以帮助我们快速查找某个数据是否存在、进行数据的排序、单词的集合(如英文单词)等。此外,二叉排序树还可以用来实现高效率的图搜索算法,如A*搜索算法。

微信扫一扫,领取最新备考资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考报考咨询

微信扫一扫,定制学习计划