16 计专

编写算法实现删除二叉查找树中的指定结点P,使得该结点删除后,树仍满足二叉查找树性质。
思路:
找到P的双亲结点。
如果P是叶结点,将其双亲的相应子树置空,删除P。
如果P只有一个孩子,则其双亲的相应指针域指向P的孩子。
如果P有两个孩子,找前驱,即左子树上最大的结点,与之交换,然后删除。

typedef struct node
{
	int data;
	struct node *left,*right;
}*BiTree;
void getParent(BiTree root,BiTree p,BiTree parent)//找到p的双亲结点
{
	if(root!=NULL)
	{
		if(root->data>p->data)
		{
			parent=root;
			getParent(root->left,p,parent);
		}
		else if(root->data<p->data)
		{
			parent=root;
			getParent(root->right,p,parent);
		}
		else return;
	}
}
void DeleteBTNode(BiTree root,BiTree p)
{
	BiTree parent=NULL;
	getParent(root,p,parent);
	if(p->left==NULL&&p->right!=NULL)//只有右子树
	{
		if(root==p)
		{
			root=p->right;
		}
		else
		{
			if(parent->data>p->data)
				parent->left=p->right;
			else
				parent->right=p->right;
		}
	}
	else if(p->left!=NULL&&p->right==NULL)//只有左子树
	{
		if(root==p)
		{
			root=p->left;
		}
		else
		{
			if(parent->data>p->data)
			{
				parent->left=p->left;
			}
			else
				parent->right=p->left;
		}
	}
	else if(p->left!=NULL&&p->right!=NULL)//有两个孩子
	{
		BiTree temp=p->left;
		while(temp->right!=NULL)//找左子树的最大结点
		{
			temp=temp->right;
		}
		int t2;  //交换temp与p结点的数据
		t2=p->data;
		p->data=temp->data;
		temp->data=t2;
		DeleteBTNode(root,temp);//删除temp
	}
	else //叶结点
	{
		if(parent->data>p->data)
			parent->left=NULL;
		else
			parent->right=NULL;
		free(p);
	}
}

编写一段代码,对给定的由整型元素节点构成的链表L,进行插入节点操作,方案是:任意两个相邻节点之间插入一个新节点,新节点中的元素值是两个相邻节点中的元素值之和。说明:假设L中的有效节点个数大于1;只针对L中原有节点进行插入节点操作。
思路:题意就是在原链表的每个相邻结点之间插入一个新结点。

typedef struct node
{
	int data;
	struct node *next;
}*list;
void insert(list head)
{
	list p=head->next->next;//p指向要插入节点的后一节点
	list pre=head->next;//pre指向要插入节点的前一节点
	while(p!=NULL)
	{
		list q=(list)malloc(sizeof(struct node));
		q->data=p->data+pre->data;
		pre->next=q;
		q->next=p;
		pre=p;
		p=p->next;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值