二叉链表的建立
给你一个根结点,然后顺着根节点生成一颗二叉树,(兄弟结点是根结点的右孩子,孩子结点是他的左孩子);求算法 我的有点问题,求解决 谢谢
void GenerateRoot(node *&head,BitTree *&root) //生成二叉树的根节点
{
node *p=head;
while(p->next!=NULL)
{
if(p->next->m_precedenceCourse==0)
{
root=new BitTree();
root->m_courseScore=p->next->m_courseScore;
root->m_courseSerial=p->next->m_courseSerial;
root->m_precedenceCourse=p->next->m_precedenceCourse;
root->lchild=NULL;
root->rchlid=NULL;
node *delnode=p->next;
p->next=delnode->next;
delnode->next=NULL;
free(delnode);
// printAll(head);
return;
}
p=p->next;
}
}
void GenerateNode(node *&head,BitTree *&p) //生成二叉树的非根节点
{ node *p1=head;
node *p2=head;
BitTree *child;
node *p3=head;
for (;p1->next!=NULL;p1=p1->next)
{
// 生成右子树
if(p1->next->m_precedenceCourse==p->m_precedenceCourse)
// 发现一门课程和指针p所指向的课程有相同的先修课then
{
child=new BitTree();
child->m_courseScore=p1->next->m_courseScore;
child->m_courseSerial=p1->next->m_courseSerial;
child->m_precedenceCourse=p1->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->rchlid=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p1->next;
p1->next=delnode->next;
delnode->next=NULL;
free(delnode);
//从课程信息链表中删除该课程信息;
GenerateNode(head,p->rchlid); // 递归调用
return;
for (;p2->next!=NULL;p2=p2->next)
{
// 生成右子树
if(p2->next->m_precedenceCourse==p->m_precedenceCourse)
// if 发现一门课程和指针p所指向的课程有相同的先修课then
{ child=new BitTree();
child->m_courseScore=p2->next->m_courseScore;
child->m_courseSerial=p2->next->m_courseSerial;
child->m_precedenceCourse=p2->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->rchlid=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p2->next;
p2->next=delnode->next;
delnode->next=NULL;
free(delnode);
//将该课程信息插入到指针p指向节点的右孩子;
///从课程信息链表中删除该课程信息;
GenerateNode(head,p->rchlid); // 递归调用
return;
}
//if 发现一门课程是指针p所指向的课程的后继课程then
if(p2->next->m_precedenceCourse==p->m_courseSerial)
{
child=new BitTree();
child->m_courseScore=p2->next->m_courseScore;
child->m_courseSerial=p2->next->m_courseSerial;
child->m_precedenceCourse=p2->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->lchild=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p2->next;
p2->next=delnode->next;
delnode->next=NULL;
free(delnode);
// 将该课程信息插入到指针p指向节点的左孩子;
// 从课程信息链表中删除该课程信息;
GenerateNode(head,p->lchild); // 递归调用
return;
}
}
}
// 生成左子树
// if 发现一门课程是指针p所指向的课程的后继课程then
if(p1->next->m_precedenceCourse==p->m_courseSerial)
{
child=new BitTree();
child->m_courseScore=p1->next->m_courseScore;
child->m_courseSerial=p1->next->m_courseSerial;
child->m_precedenceCourse=p1->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->lchild=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p1->next;
p1->next=delnode->next;
delnode->next=NULL;
free(delnode);
// 将该课程信息插入到指针p指向节点的左孩子;
// 从课程信息链表中删除该课程信息;
GenerateNode(head,p->lchild); // 递归调用
return;
for (;p3->next!=NULL;p3=p3->next)
{
// 生成右子树
//if 发现一门课程和指针p所指向的课程有相同的先修课then
if(p3->next->m_precedenceCourse==p->m_precedenceCourse)
{
child=new BitTree();
child->m_courseScore=p3->next->m_courseScore;
child->m_courseSerial=p3->next->m_courseSerial;
child->m_precedenceCourse=p3->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->rchlid=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p3->next;
p3->next=delnode->next;
delnode->next=NULL;
free(delnode);
//将该课程信息插入到指针p指向节点的右孩子;
//从课程信息链表中删除该课程信息;
GenerateNode(head,p->rchlid); // 递归调用
return;
}
// if 发现一门课程是指针p所指向的课程的后继课程then
if(p3->next->m_precedenceCourse==p->m_courseSerial)
{
child=new BitTree();
child->m_courseScore=p3->next->m_courseScore;
child->m_courseSerial=p3->next->m_courseSerial;
child->m_precedenceCourse=p3->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->lchild=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p3->next;
p3->next=delnode->next;
delnode->next=NULL;
free(delnode);
// 将该课程信息插入到指针p指向节点的左孩子;
// 从课程信息链表中删除该课程信息;
GenerateNode(head,p->lchild); // 递归调用
return;
}
}
}
}
}
void GenerateRoot(node *&head,BitTree *&root) //生成二叉树的根节点
{
node *p=head;
while(p->next!=NULL)
{
if(p->next->m_precedenceCourse==0)
{
root=new BitTree();
root->m_courseScore=p->next->m_courseScore;
root->m_courseSerial=p->next->m_courseSerial;
root->m_precedenceCourse=p->next->m_precedenceCourse;
root->lchild=NULL;
root->rchlid=NULL;
node *delnode=p->next;
p->next=delnode->next;
delnode->next=NULL;
free(delnode);
// printAll(head);
return;
}
p=p->next;
}
}
void GenerateNode(node *&head,BitTree *&p) //生成二叉树的非根节点
{ node *p1=head;
node *p2=head;
BitTree *child;
node *p3=head;
for (;p1->next!=NULL;p1=p1->next)
{
// 生成右子树
if(p1->next->m_precedenceCourse==p->m_precedenceCourse)
// 发现一门课程和指针p所指向的课程有相同的先修课then
{
child=new BitTree();
child->m_courseScore=p1->next->m_courseScore;
child->m_courseSerial=p1->next->m_courseSerial;
child->m_precedenceCourse=p1->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->rchlid=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p1->next;
p1->next=delnode->next;
delnode->next=NULL;
free(delnode);
//从课程信息链表中删除该课程信息;
GenerateNode(head,p->rchlid); // 递归调用
return;
for (;p2->next!=NULL;p2=p2->next)
{
// 生成右子树
if(p2->next->m_precedenceCourse==p->m_precedenceCourse)
// if 发现一门课程和指针p所指向的课程有相同的先修课then
{ child=new BitTree();
child->m_courseScore=p2->next->m_courseScore;
child->m_courseSerial=p2->next->m_courseSerial;
child->m_precedenceCourse=p2->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->rchlid=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p2->next;
p2->next=delnode->next;
delnode->next=NULL;
free(delnode);
//将该课程信息插入到指针p指向节点的右孩子;
///从课程信息链表中删除该课程信息;
GenerateNode(head,p->rchlid); // 递归调用
return;
}
//if 发现一门课程是指针p所指向的课程的后继课程then
if(p2->next->m_precedenceCourse==p->m_courseSerial)
{
child=new BitTree();
child->m_courseScore=p2->next->m_courseScore;
child->m_courseSerial=p2->next->m_courseSerial;
child->m_precedenceCourse=p2->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->lchild=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p2->next;
p2->next=delnode->next;
delnode->next=NULL;
free(delnode);
// 将该课程信息插入到指针p指向节点的左孩子;
// 从课程信息链表中删除该课程信息;
GenerateNode(head,p->lchild); // 递归调用
return;
}
}
}
// 生成左子树
// if 发现一门课程是指针p所指向的课程的后继课程then
if(p1->next->m_precedenceCourse==p->m_courseSerial)
{
child=new BitTree();
child->m_courseScore=p1->next->m_courseScore;
child->m_courseSerial=p1->next->m_courseSerial;
child->m_precedenceCourse=p1->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->lchild=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p1->next;
p1->next=delnode->next;
delnode->next=NULL;
free(delnode);
// 将该课程信息插入到指针p指向节点的左孩子;
// 从课程信息链表中删除该课程信息;
GenerateNode(head,p->lchild); // 递归调用
return;
for (;p3->next!=NULL;p3=p3->next)
{
// 生成右子树
//if 发现一门课程和指针p所指向的课程有相同的先修课then
if(p3->next->m_precedenceCourse==p->m_precedenceCourse)
{
child=new BitTree();
child->m_courseScore=p3->next->m_courseScore;
child->m_courseSerial=p3->next->m_courseSerial;
child->m_precedenceCourse=p3->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->rchlid=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p3->next;
p3->next=delnode->next;
delnode->next=NULL;
free(delnode);
//将该课程信息插入到指针p指向节点的右孩子;
//从课程信息链表中删除该课程信息;
GenerateNode(head,p->rchlid); // 递归调用
return;
}
// if 发现一门课程是指针p所指向的课程的后继课程then
if(p3->next->m_precedenceCourse==p->m_courseSerial)
{
child=new BitTree();
child->m_courseScore=p3->next->m_courseScore;
child->m_courseSerial=p3->next->m_courseSerial;
child->m_precedenceCourse=p3->next->m_precedenceCourse;
child->lchild=NULL;
child->rchlid=NULL;
p->lchild=child;//将该课程信息插入到指针p指向节点的右孩子;
node *delnode=p3->next;
p3->next=delnode->next;
delnode->next=NULL;
free(delnode);
// 将该课程信息插入到指针p指向节点的左孩子;
// 从课程信息链表中删除该课程信息;
GenerateNode(head,p->lchild); // 递归调用
return;
}
}
}
}
}
作者: a123456_a123456_a 发布时间: 2011-06-14
夜了 洗洗睡吧 明天有人来解决的
作者: nightkids_008 发布时间: 2011-06-14