面试常用基本代码

单链表递归逆序实现代码:

#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);
} 


posted @ 2013-09-17 20:16  godjob  Views(350)  Comments(0Edit  收藏  举报