面试常用基本代码
单链表递归逆序实现代码:
#include <iostream>
using namespace std;
struct node {
int data;
node*next;
} /* optional variable list */;
node* reverse(node * head)
{
if(head==NULL || head->next==NULL)
return head;
node* tail= head->next;
node* newHead= reverse(head->next);
tail->next=head;
head->next=NULL;
return newHead;
}
int main(int argc, const char *argv[])
{
node * h=NULL;
node * p = NULL;
int i ;
for (i = 0; i < 10; i++) {
if (h==NULL) {
h = new node();
h->data=i;
h->next=NULL;
p=h;
}
else {
p->next=new node();
p=p->next;
p->data=i;
p->next=NULL;
}
}
h= reverse(h);
for (p=h;p;p=p->next) {
cout<<p->data<<endl;
}
return 0;
}
树非递归遍历
前序非递归:
void PreOrder2(BTNode *b)
{ BTNode *St[MaxSize],*p; int top=-1;
top++; St[top]=b; //根结点入栈
while (top>-1) //栈不为空时循环
{ p=St[top]; top--; //退栈并访问该结点
printf("%c ",p->data);
if (p->rchild!=NULL) //右孩子结点入栈
{ top++; St[top]=p->rchild; }
if (p->lchild!=NULL)//左孩子结点入栈
{ top++; St[top]=p->lchild; }
}
}
中序非递归:
由中序遍历过程可知,采用一个栈保存需要返回的结点指针,先扫描(并非访问)根结点的所有左结点并将它们一一进栈。 然后出栈一个结点,显然该结点没有左孩子结点或者左孩子结点已访问过(进一步说明该结点的左子树均已访问),则访问它。然后扫描该结点的右孩子结点,将其进栈,再扫描该右孩子结点的所有左结点并一一进栈,如此这样,直到栈空为止
void PreOrder2(BTNode *b)
void InOrder2(BTNode *b)
{ BTNode *St[MaxSize],*p; int top=-1;
p=b;
while (top>-1 || p!=NULL)
{ while (p!=NULL) //扫描*p的所有左结点并进栈
{ top++; St[top]=p;
p=p->lchild;
}
if (top>-1)
{ p=St[top];top--; //出栈*p结点
printf("%c ",p->data); //访问之
p=p->rchild; //扫描*p的右孩子结点
}
}
}
后序非递归:
由后遍历过程可知,采用一个栈保存需要返回的结点指针,先扫描根结点的所有左结点并一一进栈,出栈一个结点*b即当前结点,然后扫描该结点的右孩子结点并入栈,再扫描该右孩子结点的所有左结点并入栈。当一个结点的左右孩子结点均访问后再访问该结点,如此这样,直到栈空为止。 难点:如何判断一个结点*b的右孩子结点已访问过,为此用p保存刚刚访问过的结点(初值为NULL),若b->rchild==p成立(在后序遍历中,*b的右孩子结点一定刚好在*b之前访问),说明*b的左右子树均已访问,现在应访问*b。
void PreOrder2(BTNode *b)
void PostOrder2(BTNode *b)
{ BTNode *St[MaxSize];BTNode *p;
int flag,top=-1; //栈指针置初值
do
{ while (b!=NULL) //将*b的所有左结点进栈
{ top++; St[top]=b;
b=b->lchild;
}
p=NULL; //p指向栈顶结点的前一个已访问的结点
flag=1; //设置b的左孩子为已访问过
while (top!=-1 && flag==1)
{ b=St[top]; //取出当前的栈顶元素
if (b->rchild==p)
{ printf("%c ",b->data); //访问*b结点
top--;p=b; //p指向则被访问的结点
}
else
{ b=b->rchild; //b指向右孩子结点
flag=0; //设置b的左孩子未访问
}
}
} while (top!=-1);
}

浙公网安备 33010602011771号