二叉排序树:根节点值大于树的左叶子结点值,且根节点值小于右叶子节点值
平衡二叉树:1.平衡二叉树是二叉排序树,是二叉排序树的改良版,相同序列平衡二叉树的高度小于或等于二叉排序数的
高度, 所以平衡二叉树的查找比二叉排序树快。但平衡二叉树的创建过程,保证二叉树平衡调整次数较多。
2.平衡二叉树的左右叶子结点高度差情况只能为 -1,0,1
由上特点知,如果使用中序遍历遍历二叉排序树或平衡二叉树,则得到的是一个从小到大的顺序序列。
创建二叉排序树算法:
#include<iostream>
#include<malloc.h>
using namespace std;
//二叉排序树结点
typedef struct node{
int data;
struct node *lchild;
struct node *rchild;
}node;
//创建二叉排序数
void createTree(node *&t,int k)
{
if(t==NULL)
{
t=(node *)malloc(sizeof(node));
t->data=k;
t->lchild=NULL;
t->rchild=NULL;
return;
}
else
{
if(t->data==k)
{
return;
}
else if(t->data > k)
{
createTree(t->lchild,k);
}
else
{
createTree(t->rchild,k);
}
}
}
//中序遍历输出
void MidSequence(node *t)
{
if(t)
{
MidSequence(t->lchild);
cout<<t->data<<" ";
MidSequence(t->rchild);
}
}
int main()
{
int m;
int a[100];
cin>>m; //待输入元素个数
node *t=NULL;
for(int i =0;i<m;i++)
{
cin>>a[i];
createTree(t,a[i]); //创建二叉排序树
}
MidSequence(t);//中序输出查看
}
显然:由于二叉排序树的特点,所以树中每个结点的值都是唯一的。
二叉排序树多用于查找算法中,稍改一下上述代码,相当于二分查找
//二叉排序树查找算法
void selectTree(node *t,int k)
{
if(t==NULL)
{
cout<<"查找失败" ;
return;
}
else
{
if(t->data==k) //当查找到该结点,返回该结点
{
cout<<"查找成功" ;
return;
}
else if(t->data > k)
{
selectTree(t->lchild,k);
}
else
{
selectTree(t->rchild,k);
}
}
}