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不能修改,因为如果修改了就不能保证红黑树的特性了,即有序