算法真题大全

3?已知一棵非空二叉树,遍历其第一根和中间根的结果如下:

第一根:ABCDEFGHI?

中跟:CBEDAGFHI?

构建这个二叉树。

答:?A

/ \

b?F

/ \/ \

c?D G?H

/ \

我?E

4.分析以下程序的运行时间:

a)?作废?神秘(国际)

{int?I,j,k;

for(I = 1;我& ltn;i++)

for(j = I+1;j & lt= n;j++)

for(k = 1;k & lt= j;k++)

{一些?声明?要求?O(1)?时间;}

}

我的答案是n3,但我不确定。

b)作废?podd(int?n)

{int?I,j,x,y;

for(I = 1;我& lt= n;I++)

if(奇数(I))

{ for(j = I;j & lt= n;j++)

x = x+1;

for(j = 1;j & lt= I;j++)

y = y+1;

}

}

N2不太确定?

5?已知数学表达式为(3+b) sin (x+5)-a/x2,所以需要找到这个表达式的波兰语表示的前缀和后缀表示(过程是必须的)。

表达式对应的二叉树是

所以对应的前缀是:-*+3bsin+x5/a*xx。

后缀有:3b+x5+sin*axx*/-

第三,实现以下算法

在指针实现的线性表L中,从线性表L中删除带有关键字X的节点。

答:

int visited[n];

void dfs(图g,int i)

{ edge node * t;

printf("%4d ",I);?

已访问[I]= 1;?

t = g[I];

while(t!=NULL) {

如果(访问过[t-& gt;vno]= =0)

dfs(g,t->vno);

t = t-& gt;接下来;

}

}

在线索二叉树中,根顺序的后继者由节点p找到。

答:

typedef枚举{lLINK,THREAD } PointerTag?//LINK = = 0;指针,

THREAD = = 1;线索?

typedef struct BinThrNode {?

遥测数据;

struct BinThrNode *lchilid,* rchild

指针标签ltag,rtag

}?BinThrNode,* BinThrTree?

中序遍历线索二叉树

如何找到P所指节点的前身?

当p->;当ltag==THREAD时,前驱是p->;lchild?

当p->;当ltag==LINK时,前驱是p->;lchild的右下节点。

在二叉查找树f中,实现了插入记录r。

答:

空插入(记录R,BST & ampf)

{if(F= =NULL)

{ F =新单元格类型;

f-& gt;数据= R;

f-& gt;lchild = NULL

f-& gt;rchild = NULL}

else if(R,key & ltf-& gt;data.key)

INSERT(R,F-& gt;l child);

else if(R,key & gtf-& gt;data.key)

INSERT(R,F-& gt;rchild);

}

第四,对于下面的加权连通无向图,用Prim算法构造一棵最小生成树。画出施工过程的每一步。(12分)

5.让待分类的数据存放在数组a中。

3 1 4 1 5 9 2 6 5 3

为了对堆进行分类,首先要为它建立一个初始堆,并试着画出初始堆构造过程中二叉树和数组A的变化。