• 面试常用基本代码


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

    #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);
    } 
    
    
    
  • 相关阅读:
    MongoDB,无模式文档型数据库简介
    数据说话:怎样的程序员最抢手?
    猛醒:也许我们一生追求的都错了!
    中国风电生产监控平台界面
    如何跟着趋势去赚钱
    2015年最好的员工心态培养 -- 我们需要把简单的事情做到极致
    什么是程序员的核心竞争力?
    第一篇 技术选型
    .net core 读取配置文件
    .net core nlog记录日志
  • 原文地址:https://www.cnblogs.com/UnGeek/p/3327100.html
Copyright © 2020-2023  润新知