/*-----------------------------------------------数据结构部分---------------------------------------------------------*/
/*1.写出将循环单链表中结点X的直接前驱删除的算法(X为指针,且从X指向的结点出发进行删除)。*/
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkList;
void deleteNode(LinkList *X)
{
LinkList *p = NULL, *q = NULL; //q为搜索指针,指向X的前驱的前驱;p指向q后继结点,即指向X的前驱
q = X; //从X指向的结点开始
while(q->next->next != X) //循环结束后q将指向X的前驱的前驱
{
q = q->next;
}
p = q->next;
q->next = X; //将X的前驱删除
free(p);
} //对于链表的删除算法有一个技巧就是要想删除必须的知道要删除结点的前驱结点,所以在设计算法的时候要记得把其前驱结点设出来
/*2.设某二叉树以二叉链表为存储结构,设计算法将二叉树中各结点的左右孩子位置互换。*/
//!!!!!!!考试的时候只写交换部分的代码就可以,平时练习就多练点吧
#include<stdio.h>
#include<stdlib.h>
#define max 20//定义树的结点数
typedef struct BTNode//定义二叉树结点类型
{
char data;//结点数据类型
struct BTNode *lc,*rc;//左右指针
}BTree;
BTree *createtree(char *str,int i,int m)//将字符串str中第i到第m个字符创建树
{
BTree *p;
if(i >= m)
return 0;
p = (BTree*)malloc(sizeof(BTree));//生成新结点
p->data = str[i];//将结点的第一个数据赋给根
p->lc = createtree(str,2*i+1,m);//创建左子树
p->rc = createtree(str,2*i+2,m);//创建右子树
return (p);
}
BTree *Exchange(BTree *p)//将p指针指向的二叉树的左右子树进行互换。
{
BTree *stack[max];//指针类型的堆栈
int k = 0;
stack[k] = 0;
if(p != NULL)//交换p结点的左右孩子
{
k++;
stack[k] = p->lc;
p->lc = p->rc;
p->rc = stack[k];
p->lc = Exchange(p->lc);
p->rc = Exchange(p->rc);
}
return(p);
}
void PreOrder(BTree *t)//先序遍历
{
if(t != NULL)
{
printf("%c",t->data);
if(t->lc)
{
printf("->");
PreOrder(t->lc);
}
if(t->rc)
{
printf("->");
PreOrder(t->rc);
}
}
}
void InOrder(BTree *p)//中序遍历
{
if(p != NULL)
{
InOrder(p->lc);
printf("%c",p->data);
printf("->");
InOrder(p->rc);
}
}
void PostOrder(BTree *p)//后序遍历
{
if(p != NULL)
{
PostOrder(p->lc);
PostOrder(p->rc);
printf("%c",p->data);
printf("->");
}
}
void cengci(BTree *t,int m)//按层次遍历,使用队列
{
BTree *queue[max], *p;
int front = 0,rear = 0,i;
queue[rear++] = t;
while(front != rear)
{
p = queue[front];
front = (front+1)%m;
printf("%c->",p->date);//输出根结点
if(p->lc != NULL)//遍历左子树
{
if((rear+1)%m != front)
{
queue[rear] = p->lc;
rear = (rear+1)%m;
}
}
if(p->rc != NULL)//遍历右子树
{
if((rear+1)%m != front)
{
queue[rear] = p->rc;
rear = (rear+1)%m;
}
}
}
}
int main()
{
int i,n;
char str[max];
BTree *root;//二叉树根结点的指针
printf("请输入结点数目n:");
scanf("%d",&n);
getchar();
printf("请输入%d个结点:",n);
for(i = 0;i < n;i++)
str[i] = getchar();
root = CreateTree(str,0,n); //创建树
root = Exchange(root);//交换左右子树
printf("左右子树交换后!\n");
printf("层次遍历是:\n");
cengci(root,n);
printf("\n先序遍历是:\n");
PreOrder(root);
printf("\n中序遍历是:\n");
InOrder(root);
printf("\n后序遍历是:\n");
PostOrder(root);
}
/*3.已知一棵二叉树的前序序列和中序序列分别存于两个一维数组中,试编写算法建立该二叉树的二叉链表。*/
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
/* 当前要建立的子树bt的元素总数为n,*/
/* 元素在前序序列pre的起始位置为ps,*/
/* 元素在中序序列ino的起始位置为is */
void BuildBiTree(BiTree &bt, int ps, char *pre,int is, char *ino, int n)
{
int i,in1,count = 0;
if(n < 1)
return;
bt = (BiTree)malloc(sizeof(BiTNode));
bt->data = pre[ps];
bt->lchild = NULL;
bt->rchild = NULL;
//找出中序序列的中点
for(i = is;ino[i] != pre[ps];++i)
++count;
in1 = i;
BuildBiTree(bt->lchild,ps+1,pre,is,ino,count);
BuildBiTree(bt->rchild,ps+count+1,pre,in1+1,ino,n-1-count);
}
东北大学计算机专业(专业硕士)研究生入学考试2009真题
最新推荐文章于 2021-05-23 17:22:47 发布