编写算法实现删除二叉查找树中的指定结点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;
}
}