當前位置:文思屋>學習教育>考研>

騰訊2014校園招聘C語言筆試題

文思屋 人氣:1.48W

1. 輸入一個連結串列的頭結點,從尾到頭反過來輸出每個結點的值。連結串列結點定義如下:

騰訊2014校園招聘C語言筆試題

struct ListNode

{

int m_nKey;

ListNode* m_pNext;

};

A: 遞迴方法逆序輸出,棧方法逆序輸出。 (任意實現一種既可)

void PrintListUsingRecursicve(pListNode head)

{

if(head!=NULL)

{

PrintListUsingRecursicve(head->m_pNext);

printf("%d/n",head->m_nKey);

}

}

void PrintListUsingStack(pListNode head)

{

Stack s;

=0;

pListNode p=head;

do{

push(&s,p->m_nKey);

p=p->m_pNext;

}while(p!=NULL);

while(!IsEmpty(&s))

{

printf("%d/n",pop(&s));

}

}

2. 二元樹的深度

題目:輸入一棵二元樹的根結點,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑最長路徑的長度為樹的深度。

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<time.h>

#define MAXLEN 100

#define MAXNUM 10

typedef int Tree[MAXLEN];

Tree bt;

int GetDeep(int i)

{

int l=0,r=0;

if(bt[i*2]!=-1)

{

l=GetDeep(i*2)+1;

}

if(bt[i*2+1]!=-1)

{

r= GetDeep(i*2+1)+1;

}

return l>r?l:r;

}

int main()

{

int i=0;

memset(bt,-1,sizeof(bt));

for(i=1;i<=MAXNUM;i++)

bt[i]=i;

bt[(i-1)*2]=i*2;

printf("%d /n",GetDeep(1));

return 0;

}

3. 整數的二進位制表示中1的個數

題目:輸入一個整數,求該整數的二進位制表達中有多少個1。例如輸入10,由於其二進位制表示為1010,有兩個1,因此輸出2。

(關鍵是能不能想到後面的那個方法,只要想到這個方法既可)

int Bit1inInt(int i)

{

int result=0;

do{

result+=i&1;

}while(i=i>>1);

return result;

}

4. 從上往下遍歷二元樹

題目:輸入一顆二元樹,從上往下按層列印樹的每個結點,同一層中按照從左往右的順序列印。

(先序,中序,後序三種方式實現)

如果從上往下,從左到右的話只有一種遍歷的`方式:廣度優先遍歷。

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<time.h>

#define MAXLEN 100

#define MAXNUM 10

typedef int Tree[MAXLEN];

Tree bt;

typedef struct queue

{

int begin,end;

int space[MAXLEN];

}Queue;

int main()

{

int i=0;

memset(bt,-1,sizeof(bt));

for(i=1;i<=MAXNUM;i++)

bt[i]=i;

Queue qe;

n=0; =0;

e[++]=bt[1];

while(n!=)

{

if(bt[2*e[n]]!=-1)//lchild

{

e[++]=bt[2*e[n]];

}

if(bt[2*e[n]+1]!=-1)//rchild

{

e[++]=bt[2*e[n]+1];

}

n++;

}

printf("--------------------/n");

for(i=0;i<;i++)

printf("%d ",e[i]);

return 0;

}

先序,中序,後序三種方式的只是遍歷二元樹

typedef int Tree[MAXLEN];

Tree bt;

void PreOrderTraverse(int i)

{

if(bt[i]==-1) {return }

printf("%d ",bt[i]);

PreOrderTraverse(i*2);//lchild

PreOrderTraverse(i*2+1);//rchild

}

void InOrderTraverse(int i)

{

if(bt[i]==-1) {return }

InOrderTraverse(i*2);//lchild

printf("%d ",bt[i]);

InOrderTraverse(i*2+1);//rchild

}

void PostOrderTraverse(int i)

{

if(bt[i]==-1) {return }

PostOrderTraverse(i*2);//lchild

PostOrderTraverse(i*2+1);//rchild

printf("%d ",bt[i]);

}

int main()

{

int i=0;

memset(bt,-1,sizeof(bt));

for(i=1;i<=MAXNUM;i++)

bt[i]=i;

printf("/n---------------/n");

PreOrderTraverse(1);

printf("/n---------------/n");

InOrderTraverse(1);

printf("/n---------------/n");

PostOrderTraverse(1);

return 0;

}

5. 查詢連結串列中倒數第k個結點

題目:輸入一個單向連結串列,輸出該連結串列中倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標。連結串列結點定義如下:

struct ListNode {

int m_nKey;

ListNode* m_pNext;

};

(最快的方法,只遍歷一遍)

int FindCoundDownInList(pListNode head,int num)

{

pListNode p1,p2;

p1=p2=head;

while(num-->0 && p1!=NULL) p1=p1->m_pNext;

if(p1==NULL) return 0;

else{

while(p1!=NULL)

{

p1=p1->m_pNext;

p2=p2->m_pNext;

}

return p2->m_nKey;

}

}