二叉排序树(binary sort tree)又称二叉搜索树(binary search tree),或者是一棵空树,或者是具有下列性质的二叉树:
1.若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值。
2.若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值。
3.它的左子树和右子树也分别为二叉排序树。
性能分析:
每个结点的C(i)为该结点的层次数。最坏情况下,当先后插入的关键字有序时,构成的二叉排序树蜕变为单支树,树的深度为其平均查找长度为(n+1)/2(和顺序查找相同),最好的情况是二叉排序树的形态和折半查找的判定树相同,其平均查找长度和log 2 (n)成正比
优化:
Size Balanced Tree(SBT),AVL树,红黑树,Treap(Tree+Heap),这些均可以使查找树的高度为O(log(n))。
#include <iostream>
#include <cstdio>
using namespace std;
typedef struct Node
{
Node* left;
Node* right;
int data;
Node(int dat)
{
left = right = NULL;
data = dat;
}
}*pNode, Node;
//插入结点
pNode Insert(int data, pNode p)
{
if (p==NULL)
{
p = new Node(data);
}
else if (data < p->data)
{
p->left = Insert(data, p->left);
}
else
{
p->right = Insert(data, p->right);
}
return p;
}
//删除结点
pNode Delete(int data, pNode &p)
{
if (p==NULL)
return NULL;
if (data==p->data)//找与data值相等结点
{
if (p->right==NULL)//如果右儿子不存在,则结点p等于其左二子
{
pNode t = p;
p = p->left;
free(t);
}
else //右儿子存在,则找到右儿子的左儿子左儿子。。。(即大于等于data的最小值)
{
pNode head = p->right;
while (head->left)
head = head->left;
//cout << p->data << endl;
p->data = head->data;
//cout << p->data << endl;
Delete(p->data, p->right);
}
}
else if (data < p->data)
{
Delete(data, p->left);
}
else if (data > p->data)
{
Delete(data, p->right);
}
}
//遍历
void BianLi(pNode p)
{
if (p==NULL)
return ;
BianLi(p->left);
printf("%d ", p->data);
BianLi(p->right);
}
int main()
{
int a[11] = {5,5,2,8,9,6,3,10,4,7,1};
int n = 11;
pNode root = new Node(a[0]);
for (int i=1; i<n; ++i)
root = Insert(a[i], root);
BianLi(root);
printf("\n");
Delete(9, root);
Delete(5, root);
Delete(5, root);
BianLi(root);
printf("\n");
//system("pause");
return 0;
}