天勤8套卷1——数据结构篇

中缀表达式求表达式值

定义两个栈,stack1存储数字,stack2存储运算符。

扫描中缀表达式:

(1)若为数字则进栈stack1

(2)若为运算符‘(’直接进栈stack2;

     若为运算符‘)’则将栈里的运算符一个个出栈,弹出stack1的两个数字进行运算结果再入stack1,直到遇到‘(’并将其删除;

     若为其他运算符,弹出stack2中所有的优先级大于等于该运算符的运算符进行运算

扫描结束,stack1中的一个数就是结果。

天勤8套卷1——数据结构篇_第1张图片

C

天勤8套卷1——数据结构篇_第2张图片 

D

平衡因子、树的度

结点的度左子树与右子树的高度差为该结点的平衡因子。

结点的子女数目称为结点的度。树的度是所有结点度之和

D

 C

天勤8套卷1——数据结构篇_第3张图片

C

天勤8套卷1——数据结构篇_第4张图片

 A

子图(边集合顶点集都是原图的子集)、生成子图(边集是子集、顶点集与原图相同)

极大连通子图,极大即要求连通又要包含最多的边;极小连通子图既要保持图连通又要使得边数最少。

无向图中的极大连通子图称为连通分量。

连通图的生成树是包含图中全部顶点的一个极小连通子图。

天勤8套卷1——数据结构篇_第5张图片

 D

C

天勤8套卷1——数据结构篇_第6张图片 

天勤8套卷1——数据结构篇_第7张图片

A

天勤8套卷1——数据结构篇_第8张图片

解答:

1)算法的基本设计思想:

单链表逆序存放大整数的各个数字,即先存低位再存高位,而加法运算顺序也是低位到高位。模拟加法运算,设置变量carry存储低位进位,,设置链表result存储运算结果。顺序从两链表第一个存储数字的结点开始运算。将链表p和q对应结点存储的数字以及carry相加,结果取余为该位相加结果,结果除10为该位进位。若某一链表之后没有结点了表示对应位数字为0,直至两个链表的所有结点数字均计算完毕,若最高位有进位,则需再新增一个结点存储该位。

2)

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode;

void addLargeInt(LNode *p,LNode *q,LNode *& result){
    LNode *tempP=p->next;
    LNode *tempQ=q->next;
    LNode *r=NULL;
    result=(LNode *)malloc(sizeof(LNode));
    result->next=NULL;
    r=result;
    int carry=0;
    while(tempP!=NULL&&tempQ!=NULL){
         LNode *temp=(LNode *)malloc(sizeof(LNode));
         temp->next=NULL;
         temp->data=(tempP->data+tempQ->data+carry)/10;
         carry=(tempP->data+tempQ->data+carry)%10;
         r->next=temp;
         r=r->next;
         tempP=tempP->next;
         tempQ=tempQ->next;
   }
   if(tempQ!=NULL)tempP=tempQ;
   while(tempP!=NULL){
         LNode *temp=(LNode *)malloc(sizeof(LNode));
         temp->next=NULL;
         temp->data=(tempP->data+carry)/10;
         carry=(tempP->data+carry)%10;
         r->next=temp;
         r=r->next;
         tempP=tempP->next;
  }
  if(carry>0){
         LNode *temp=(LNode *)malloc(sizeof(LNode));
         temp->next=NULL;
         temp->data=carry;
         r->next=temp;
  }
}    

3)时间复杂度为O(max(m,n)),其中m,n分别为两操作链表长度。

     空间复杂度为O(max(m,n)),其中m,n分别为两操作链表长度。

BTNode * getParent(BTNode *t,BTNode *p){
   //只考虑p是正确的输入的情况
   if(t==NULL)
      return NULL;
   if(t->lchilde==p||t->rchild==p)
      return t;
   BTNode *parent=getParent(t->lchild,p);
   if(parent!=NULL)
       return parent;
   else
       return getParent(t->rchild,p);
}

 时间复杂度为O(n),n为二叉树的结点数

 

你可能感兴趣的:(数据结构)