二叉排序树
(本文仅为笔者学习笔记,如有错误之处恳请各位读者指正)
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索数。与二叉树类似,其每个节点只有一个左子树和一个右子树,且左右子树满足一下性质。
性质:
- 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值
- 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值
- 左、右子树也分别为二叉排序树
结点结构:
每个结点具有一个结点值,及一个左子树指针和一个右子树指针。
struct BiTreeNode{
int data;
struct BiTreeNode *right, *left;
BiTreeNode(int data){
this->data = data;
this->right = NULL;
this->left = NULL;
}
};
插入:
根据左右子树的特点递归插入结点来创建二叉排序树。
void creatBiTree(BiTreeNode *node, int data){
if(root == NULL){ // 根结点不存在
root = new BiTreeNode(data);
}
else{
if(data < node->data){ // 小于当前节点,向左走
if(node->left) // 左子树存在
creatBiTree(node->left, data); // 递归左子树
else // 左子树不存在
node->left = new BiTreeNode(data); // 直接创建节点
}else{
if(node->right) // 右子树存在
creatBiTree(node->right, data); // 递归右子树
else
node->right = new BiTreeNode(data);
}
}
}
遍历:
不同的遍历方式,输出语句对应的位置不同(这里的遍历指输出结点值)。
void inOrderTraverse(BiTreeNode *node){
if(node!=NULL){
// printf("%d ", node->data); // 前序遍历
inOrderTraverse(node->left);
printf("%d ", node->data); // 中序遍历
inOrderTraverse(node->right);
// printf("%d ", node->data); // 后序遍历
}
}
查找:
查找是否存在值为k的结点。
bool seek(BiTreeNode *node, int k){
if(node->data == k)
return true;
else if(k < node->data && node->left)
return seek(node->left, k);
else if(k > node->data && node->right)
return seek(node->right, k);
else
return false;
}
完整测试代码:
#include<cstdio>
using namespace std;
struct BiTreeNode{
int data;
struct BiTreeNode *right, *left;
BiTreeNode(int data){
this->data = data;
this->right = NULL;
this->left = NULL;
}
};
BiTreeNode* root; // 树根指针
void creatBiTree(BiTreeNode *node, int data){
if(root == NULL){ // 根结点不存在
root = new BiTreeNode(data);
}
else{
if(data < node->data){ // 小于当前节点,向左走
if(node->left) // 左子树存在
creatBiTree(node->left, data); // 在左子树上添加节点
else // 左子树不存在
node->left = new BiTreeNode(data); // 直接创建节点
}else{
if(node->right) // 右子树存在
creatBiTree(node->right, data); // 在右子树上添加节点
else
node->right = new BiTreeNode(data);
}
}
}
// 遍历二叉树
void inOrderTraverse(BiTreeNode *node){
if(node!=NULL){
// printf("%d ", node->data); // 前序遍历
inOrderTraverse(node->left);
printf("%d ", node->data); // 中序遍历
inOrderTraverse(node->right);
// printf("%d ", node->data); // 后序遍历
}
}
// 查找
bool seek(BiTreeNode *node, int k){
if(node->data == k)
return true;
else if(k < node->data && node->left)
return seek(node->left, k);
else if(k > node->data && node->right)
return seek(node->right, k);
else
return false;
}
int main(){
int a[]={7, 3, 2, 9, 5, 1, 8, 4, 6, 0}; // 待排序数组
for(int i=0; i<10; i++)
creatBiTree(root, a[i]);
inOrderTraverse(root);
printf("\n是否存在值为10的结点:%s\n", seek(root,10)==1?"true":"false");
return 0;
}