标签:
一、概述
二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构。中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索,插入,删除的复杂度等于树高,O(log(n)).
二、二叉搜索树的结构
二叉搜索树,对于任何节点x,左子树的关键字最大不超过x的关键子,右子树的关键子最小不低于x的关键字,如下图。直观的看,就是左大右小的一个递归结构。递归结构不怎么符合我们人的正常性的思维,需要仔细理解。
二叉搜索书的c++结构定义:
struct treeNode
{
treeNode* left;
treeNode*right;
treeNode*p;
int value;
void*pData;
};
struct Tree
{
treeNode *root;
//int nsize;
};三、算法
在二叉搜索树结构定义的基础上,主要有以下的一些算法
(1)插入
就是能在二叉树正确位置上插入节点,首先需要定位要插入的位置,然后进行插入即可。
void treeInsert(Tree &tree, treeNode*p)
{
treeNode*pTemp=tree.root;//用于遍历
treeNode *y=NULL;// 用于保存遍历的正确结果
//进行二叉遍历
while(pTemp!=NULL)
{
y=pTemp; //保存结果
if(pTemp->value<p->value)
pTemp=pTemp->right;
else
pTemp=pTemp->left;
}
p->p=y; //设置好插入节点的父节点
if(y==NULL) //如果遍历的结果为空,说明该棵树为空树,
tree.root=p;
else if(y->value>p->value)//插入正确的节点
y->left=p;
else
y->right=p;
}(2)删除
删除一个二叉搜索树的节点z,稍微复杂一些。在z为根的子树中,找到z的后继,并形成一颗正确的二叉搜索的子树,加入到z之前的父节点中即可。
主要分为以下四种情况:
a、节点z的左子树为空
b、节点z的右子树为空
c、节点z的右节点是z的后继
d、节点z的右节点不是z的后继
void transPlant(Tree &tree,treeNode*u,treeNode*v)//将以v根的子树,替换以u为根的子树
{
if (u->p==NULL)
tree.root=v;
else if(u==u->p->left)
u->p->left=v;
else
u->p->right=v;
if(v!=NULL)
v->p=u->p;
}
void treeDelete(Tree &tree,treeNode*z)
{
if(z->left==NULL)//情况1
transPlant(tree,z,z->right);
else if(z->right==NULL)//情况2
transPlant(tree,z,z->left);
else
{
treeNode*p=NULL;
treeNode*pTemp=z->right;
while(pTemp!=NULL)
{
p=pTemp;
pTemp=pTemp->left;
}
if(p==z->right)//情况3
{
transPlant(tree,z,z->right);
p->left=z->left;
p->left->p=p;
}
else//情况4
{
transPlant(tree,p,p->right);
p->right=z->right;
p->right->p=p;
transPlant(tree,z,p);
p->left=z->left;
p->left->p=p;
}
}
(3)遍历
遍历就是遍历一下二叉搜索树的结构。
void treeWalk(treeNode *p)
{
if(p!=NULL)
{
treeWalk(p->left);
std::cout<<p->value;
treeWalk(p->right);
}
}
(4)查询
在二叉搜索树结构的基础上,查询二叉树的某个节点。
treeNode * treeSearch(treeNode*p,int k)
{
if(p==NULL || p->value==k)
return p;
if(k<p->value)
return treeSearch(p->left,k);
else
return treeSearch(p->right,k);
}treeNode *createNode(int k)
{
treeNode *p=new treeNode();
p->value=k;
p->p=NULL;
p->left=NULL;
p->right=NULL;
p->pData=NULL;
return p;
}int _tmain(int argc, _TCHAR* argv[])
{
Tree tree;
tree.root=NULL;
treeInsert(tree,createNode(10));
treeInsert(tree,createNode(11));
treeInsert(tree,createNode(12));
treeInsert(tree,createNode(8));
treeInsert(tree,createNode(22));
treeInsert(tree,createNode(3));
treeDelete(tree,treeSearch(tree.root,8));
treeDelete(tree,treeSearch(tree.root,3));
treeWalk(tree.root);
int j;
std::cin>>j;
return 0;
}
标签:
原文地址:http://blog.csdn.net/kupepoem/article/details/45457877