删除算法
Ⅰ 请教二叉树的插入和删除算法
哥们,插入和删除的代码如下
//设置条件插入
template<class T>
bool BinaryTree<T>::InsertChild(BTNode<T>*p,const int&LR,BinaryTree<char>&r)
{
BTNode<T>*q,*s;
if (p)
{
q=r.Root();
s=_Copy(q);
if (LR==0)
{
s->rChild=p->lChild;
p->lChild=s;
}
else
{
s->lChild=p->rChild;
p->rChild=s;
}
return true;
}
return false;
}
//设置条件删除
//当which为0时,删除左子树,为1时删除右子树
template<class T>
void BinaryTree<T>::DeleteChild(BTNode<T>*p,int which)
{
if (which==0)
{
_Destroy(p->lChild);
}
if (which==1)
{
_Destroy(p->rChild);
}
}
Ⅱ 顺序表、单链表的删除算法
单链表的删除操作是指删除第i个结点,返回被删除结点的值。删除操作也需要从头引用开始遍历单链表,直到找到第i个位置的结点。如果i为1,则要删除第一个结点,则需要把该结点的直接后继结点的地址赋给头引用。对于其它结点,由于要删除结点,所以在遍历过程中需要保存被遍历到的结点的直接前驱,找到第i个结点后,把该结点的直接后继作为该结点的直接前驱的直接后继。删除操作如图
单链表的删除操作示意图
删除操作的算法实现如下:
public T Delete(int i)
{
if (IsEmpty()|| i < 0)
{
Console.WriteLine("Link is empty or Position is error!");
return default(T);
}
Node q = new Node();
if (i == 1)
{
q = head;
head = head.Next;
return q.Data;
}
Node p = head;
int j = 1;
while (p.Next != null&& j < i)
{
++j;
q = p;
p = p.Next;
}
if (j == i)
{
q.Next = p.Next;
return p.Data;
}
else
{
Console.WriteLine("The ith node is not exist!");
return default(T);
}
}
算法的时间复杂度分析:单链表上的删除操作与插入操作一样,时间主要消耗在结点的遍历上。如果表为空则不进行遍历。当表非空时,删除第i个位置的结点, i等于1遍历的结点数最少(1个),i等于n遍历的结点数最多(n个,n为单链表的长度),平均遍历的结点数为n/2。所以,删除操作的时间复杂度为O(n)。
Ⅲ 删除算法中for(p->next
对着自己的数据类型做相应地修改:
void Delete(SeqList L, DataType x)
{ // 顺序表的删除内算法
int i = 0, j;
for (j = 0; j < L->length; j ++)
容if (L->data[j] != x)
{
if (i < j)
L->data[i] = L->data[j];
i ++;
}
L->length = i;
}
void Delete_List(LinkList head, DataType x)
{ // 有头结点单链表的删除算法
Node *p, *q, *s;
p = head->next;
q = head;
while (p != NULL)
{
if (p->data != x)
q = p;
else
{
s = p;
q->next = s->next;
free(s);
}
p = q->next;
}
}
Ⅳ 顺序表删除算法求修改(顺序表中删除,否则不删除,最后输出此顺序表中所有的结点)
void deletelist ( seqlist *l ,datatype x)
{
int j;
if (i<0 || i>l->length-1)
{
printf(" \n position error!");
return;
}
if (l->length==0)
{
printf(" \n underflow!");
return;
}
for (j=i+1;j<=l->length-1;j++)
l->data[j-1]=l->data[j];
l->length--;
}
这个函数有问题,因为当没找到元素的时候你虽然判断出来了,但是没有停止程序往下执行,导致长度减1,只需要没找到元素时让程序return就行了
Ⅳ java如何实现二叉树的删除算法
按照深度优先搜索找到需要删除的节点。然后,将左子树的最右子节点和该节点交换, 删除节点。 如果该节点的左子树是空,则用该节点的右子树替换该节点。
程序就自己写吧。
Ⅵ 顺序表删除算法
能删最后一个元素,注意这个算法中的形参i是指的位置,不是下标,位置比下标大1,你看第二个if(i<1||i>length),大于length才是异常抛出,但最后一个元素的位置是i=length,也就是下标为length-1,并不在这个范围内。
Ⅶ c语言 (删除算法)随机输入10个整数存入数组中,再输入一个key值,若数组中有与key相同的值,删除之;若
我写了一个,严格说不算删除数组中与key相同的值,不过你可以改一下。
#include <stdio.h>
int main()
{
int i,j=0,key,a[10];
printf("请输入10个整数:\n");
for(i=0;i<10;++i)
{
scanf("%d",&a[i]);
}
printf("请输入一个你想删除的整数key值:\n");
scanf("%d",&key);
for(i=0;i<10;++i)
{
if(a[i]==key)j=i; //j代表与key值相同的数的位置
}
if(j==0)
printf("%d不存在!\n",key);
else
{
printf("新数组:\n");
for(i=0;i<10;++i)
{
if(i!=j)
printf("%d ",a[i]);
}
}
return 0;
}
Ⅷ 字符串删除算法!
我不是学c的所以不知道。办法的话很清楚。
先从后向前找' ',找到位置后减1,从头到这个位置。
pascal语言的话我知道
Ⅸ 求一个c语言删除算法
顺序表的int delete(Slist *p,int i){int j;</p><p>if(i<1||i>p->5)</p><p>{printf{"position error.");</p><p>return(0);</p><p>for(j=i;j<p->5;j++)</p><p>p->data[j-1]=p->data[j];</p><p>p->5--;</p><p>return(1);</p><p>}
Ⅹ 线性表执行删除算法时需要移动几个数据元素要移动几次若删除每个元素均等,则平均移动元素的个数是多
线性表:1、2、3、4、5、6、7,
删除元素3后: 1、2、4、5、6、7。
线性表删除时,要删除元素的后面的元素依次前移,移动个数为后面元素的个数;
每个元素向前移一位,移动一次;
设线性表有n个元素,每个元素删除的概率相等,删除第一个元素需要移动n-1个,删除第n个元素需要移动0个,所以平均移动元素个数是((n-1)+(n-2)+..+1+0)/n=(n-1)/2。