错题整理5

1、关于二叉搜索树特性说法错误的是( )

A.二叉搜索树最左侧的节点一定是最小的

B.二叉搜索树最右侧的节点一定是最大的

C.对二叉搜索树进行中序遍历,一定能够得到一个有序序列

D.二叉搜索树的查找效率为O(log_2N)

答案:D

 解析:

A、B、C都是二叉搜索树的性质

D:二叉搜索树最差情况下会退化为单支树,因此:其查找的效率为O(N)

2、下面关于二叉搜索树正确的说法是( )

A.待删除节点有左子树和右子树时,只能使用左子树的最大值节点替换待删除节点

B.给定一棵二叉搜索树的前序和中序遍率历结果,无法确定这棵二叉搜索树

C.给定一棵二叉搜索树,根据节点值大小排序所需时间复杂度是线性的

D.给定一棵二叉搜索树,可以在线性时间复杂度内转化为平衡二叉搜索树

答案:C

解析:

 A:错误,当待删除节点的左右子树均存在时,既可以在左子树中找一个最大的节点作为替代节 点,也可以在右子树中找一个最小的节点作为替代节点,左右子树中都可以找替代节点

  B:错误,根据前序遍历和中序遍历,是可以确定一棵树的结构,使用两个遍历结果确定树的结构, 其中有一个遍历结果必须要是中序遍历结果。

  C:正确,二叉搜索树遍历一遍,就可以得到一个有序序列,因此,时间复杂度为O(N)

  D:错误,这里面还需要牵扯到旋转等其他操作,时间复杂度不是线性的

3、关于虚表说法正确的是( )

A.一个类只能有一张虚表

B.基类中有虚函数,如果子类中没有重写基类的虚函数,此时子类与基类共用同一张虚表

C.虚表是在运行期间动态生成的

D.一个类的不同对象共享该类的虚表

答案:D

解析:

A:在多重继承的时候,一个类会有多张父类的虚表。

B:父类和子类不会共用同一张虚表,子类会生成一张新的虚表。

C: 虚表是在编译期间生成的

D:一个类的对象共用同一张虚表。

4、以下程序输出结果是( )

class A

{

public:

  A ():m_iVal(0){test();}

  virtual void func() { std::cout<<m_iVal<<‘ ’;}

  void test(){func();}

public:

  int m_iVal;

};



class B : public A

{

public:

  B(){test();}

  virtual void func()

  {

    ++m_iVal;

    std::cout<<m_iVal<<‘ ’;

  }

};



int main(int argc ,char* argv[])

{

  A*p = new B;

  p->test();

  return 0;

}

A.1 0

B.0 1

C.0 1 2

D.2 1 0

E.不可预期

F. 以上都不对

答案:C

解析:

new B的时候先调用父类A的构造函数,执行test()很熟,再调用func()函数,由于这个时候还处于对象的构造阶段,没有形成虚表,没有构成多态,因此这个时候的func()函数是父类的func()函数,打印0。

构造完父类之后执行子类的构造函数,调用test()函数,再调用func()函数,由于父类已经构造完毕,生成了虚表,并且func()函数也满足多态的要求,构成多态,调用子类的func()函数,m_iVal加1,打印1。

p是父类指针,调用子类对象的时候执行的是子类的func()函数,m_Val加1,因此会打印2。 

5、假设D类先继承B1,然后继承B2,B1和B2基类均包含虚函数,D类对B1和B2基类的虚函数重写了,并且D类增加了新的虚函数,则:( )

A.D类对象模型中包含了3个虚表指针

B.D类对象有两个虚表,D类新增加的虚函数放在第一张虚表最后

C.D类对象有两个虚表,D类新增加的虚函数放在第二张虚表最后

D.以上全部错误

答案:B

解析:

A.D类有几个父类,如果父类有虚函数,则就会有几张虚表,自身子类不会产生多余的虚表,所以只有2张虚表

B.正确

C.子类自己的虚函数只会放到第一个父类的虚表后面,其他父类的虚表不需要存储,因为存储了也不能调用

D.错误

6、下面函数输出结果是( )

class A

{

public: 

  virtual void f()

  {

    cout<<"A::f()"<<endl;

  }

};



class B : public A

{

private:

   virtual void f()

  {

    cout<<"B::f()"<<endl;

  }

};



A* pa = (A*)new B;

pa->f();

A.B::f()

B.A::f(),因为子类的f()函数是私有的

C.A::f(),因为强制类型转化后,生成一个基类的临时对象,pa实际指向的是一个基类的临时对象

D.编译错误,私有的成员函数不能在类外调用

答案:A

解析:

A、B、D: 虽然子类函数为私有,但是多态仅仅是用子类函数的地址覆盖虚表,最终调用的位置不变,只是执行函数发生变化,因此编译正确,并且调用子类的虚函数,输出B::f()

C:这里不是强制类型转换,是赋值兼容原则。

7、下面关于map的说法正确的是()

A.map的查询效率是O(log_2N),因为其底层使用的是二叉搜索树

B.map的key和value的类型可以相同

C.map中的有序只能是升序,不能是降序

D.map中的key可以直接修改

答案:B

解析:

A:错误,map的查询效率是O(log_2N)是正确的,但map的底层结构不是二叉搜索树,而是红黑树

B:正确,key和value的类型由用户自己设置,可以相同也可以不同,取决于应用场景需要

C:错误,map可以是升序,也可是降序,默认情况下是升序,如果需要降序,需要用户在实例化 map时指定比较规则

D:错误,map中key不能修改,因为如果修改了就不能保证红黑树的特性了,即有序

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值