1. 輸入一個連結串列的頭結點,從尾到頭反過來輸出每個結點的值。連結串列結點定義如下:
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;
}
}