//二叉排序树
//BST-插入
bool BST_Insert(BiTree *Tree,int Num)
{
if ((*Tree)==NULL)
{
(*Tree) = (BiTree)malloc(sizeof(BiNode));
(*Tree)->data = Num;
(*Tree)->lchild = (*Tree)->rchild = NULL;
return true;
}
else if(Num<((*Tree)->data))
{
return BST_Insert(&((*Tree)->lchild),Num);
}
else if (Num>((*Tree)->data))
{
return BST_Insert(&((*Tree)->rchild),Num);
}
else
{
return false;
}
}
//BST-建立
bool BST_Bulid(BiTree *Tree,ElemType Buff[],int len)
{
int ErrorCnt=0;
for (int i=0;i<len;i++)
{
if (!BST_Insert(Tree,Buff[i]))
{
ErrorCnt++;
}
}
if (ErrorCnt>0)
{
return false;
}
else
{
return true;
}
}
//递归查找
BiTree BST_Search1(BiTree Tree,ElemType num)
{
if (Tree==NULL)
{
return NULL;
}
if (Tree->data<num)
{
return BST_Search1(Tree->rchild,num);
}
else if(Tree->data>num)
{
return BST_Search1(Tree->lchild,num);
}
else
{
return Tree;
}
}
//迭代查找
BiTree BST_Search2(BiTree Tree,ElemType num)
{
while(Tree!=NULL)
{
if (num==(Tree->data))
{
return Tree;
}
else if (num<(Tree->data))
{
Tree=Tree->lchild;
}
else
{
Tree=Tree->rchild;
}
}
return NULL;
}
//删除某个元素
//左或右子树为空,直接用左子树或右子树的值代替;
//否则,找到右子树中中序遍历的第一个元素代替上去。
//中序遍历第一个元素是最左边的元素
bool BST_Delete(BiTree Tree,ElemType num)
{
ElemType Temp;
BiTree DeleteNode = BST_Search1(Tree,num);
if (DeleteNode!=NULL)
{
if (DeleteNode->lchild==NULL)
{
BiTree Temp;
DeleteNode->data = DeleteNode->rchild->data;
Temp = DeleteNode->lchild;
//注意下面这两行顺序不能颠倒
DeleteNode->lchild = DeleteNode->rchild->lchild;
DeleteNode->rchild = DeleteNode->rchild->rchild;
DeleteNode = Temp;
}
else if(DeleteNode->rchild==NULL)
{
BiTree Temp;
DeleteNode->data = DeleteNode->lchild->data;
Temp = DeleteNode->lchild;
//注意下面这两行顺序不能颠倒
DeleteNode->rchild = DeleteNode->lchild->rchild;
DeleteNode->lchild = DeleteNode->lchild->lchild;
DeleteNode = Temp;
}
else
{
BiTree MidOrderFirstElem = DeleteNode;
if (MidOrderFirstElem->rchild->lchild!=NULL)
{
MidOrderFirstElem = MidOrderFirstElem->rchild;
while(MidOrderFirstElem->lchild->lchild!=NULL)
{
MidOrderFirstElem = MidOrderFirstElem->lchild;
}
DeleteNode->data = MidOrderFirstElem->lchild->data;
DeleteNode = MidOrderFirstElem->lchild;
MidOrderFirstElem->lchild = DeleteNode->rchild;
}
else
{
MidOrderFirstElem->data = MidOrderFirstElem->rchild->data;
DeleteNode = MidOrderFirstElem->rchild;
MidOrderFirstElem->rchild = MidOrderFirstElem->rchild->rchild;
}
}
free(DeleteNode);
return true;
}
else
{
return false;
}
}
二叉排序树BST|树
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 判断是否是二叉排序树:下面采用采用两种方法,1.递归的进行判断。2.用中序遍历判断。后更:第一种方法实际上是错误的...
- 中序遍历,但是记住要保存前一个节点的指针,因此要用到指针的指针作为参数。同时,因为最后要返回头指针,不要把返回头指...
- RT,从小到大输出我们都知道——中序遍历,但是如何从大到小呢?我首先想到用一个辅助栈来帮忙,中序遍历输入到栈,再出...