php 数据结构常见面试题目


1,二叉树深度优先遍历和广度优先遍历

深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,剋细分为 前序遍历,中序遍历,后序遍历 (小窍门:看根节点再前中后?)

前序遍历:根节点->左节点->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点

广度优先遍历:又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。

二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。

2,堆和栈的区别

(1)堆是一个完全二叉树,而且某个节点的值总是不大于或不小于父节点的值(有最大堆和最小堆)

栈是一个先进后出的线性表,(在栈顶进行操作)

(2)堆的存取是随意的,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书

(3)内存的申请方式不同

栈:由操作系统(编译器)自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

(4)内存的申请效率不同

栈:栈由系统自动分配,速度较快

堆:堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便

(5)申请大小的限制

栈:是连续内存 在window里面,栈的大小是2M,如果空间过大的话,会提示overflow

堆:不是连续内存,堆获得的空间比较灵活,也比较大

(6)缓存方式

栈:使用的是一级缓存,通常都是被调用的时候处于存储空间中,调用完立即释放

堆:放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度相对来说更低。

(关于一级内存,二级内存:https://blog.csdn.net/penghuasheng/article/details/1761566

(7)回收方式

栈:由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。

堆:堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露

第二题借鉴以下博客:

https://blog.csdn.net/langb2014/article/details/79376349

https://www.jianshu.com/p/5f148c3e4f7d

3,链表反转

例如:  输入: 1->2->3->4->5->NULL       输出: 5->4->3->2->1->NULL

 

设置两个指针 new(刚刚修改完的界定),old(没有修改的老的节点),

把old的指针指向new,所以这个时候需要记录old的下一个节点,即 tmp=old->next

这时 把new=old old=tmp 开始下一轮的循环

伪代码:

while(old!=null){ 
 tmp=old->next  
 old->next=new  
 new=old  
 old=tmp 
}

扩展:

要把 head->1->2->3->4->5->6
改成 head->4->3->2->1->5->6
如下代码:(前面加一个头指针会更好处理)

ptr reverse(ptr head,int k)
{
    cnt=1;
    new=head->next;
    old=new->next;
    while( cnt < K ){
        tmp = old->next;
        old->next = new;
        new = old; old = tmp;
        cnt++;
    }
    head->next->next = old;
    return new;
}

链表逆转学习通过:

https://haokan.baidu.com/v?vid=17680630196571888503&pd=bjh&fr=bjhauthor&type=video

 4,红黑树:
红黑树的特性和优势,在神魔情况下需要变色,在神魔情况下需要旋转

红黑树是基于二叉查找树

二叉查找树的特性:

1.左子树上所有结点的值均小于或等于它的根结点的值。

2.右子树上所有结点的值均大于或等于它的根结点的值。

3.左、右子树也分别为二叉排序树。

查找的方式正是二分查找的思想,查找所需的最大次数等同于二叉查找树的高度。

在插入节点的时候也是利用类似的方法,通过一层层比较大小,找到新节点适合插入的位置

但是插入数据的时候,二叉查找树的性能可能会降低(变成瘸子)

然后红黑树就应运而生

红黑树是一种自平衡的二叉查找树,除了符合二叉查找树的基本特性外,还有下面的附加特性

1.节点是红色或黑色。

2.根节点是黑色。

3.每个叶子节点都是黑色的空节点(NIL节点)。

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

红黑树从样子的最长路径不会超过最短路径的二倍

当插入或删除节点的时候,红黑树的规则有可能会被打破,这时候需要做一些调整来维持规则

调整的方法有两种:变色和旋转(左旋转和右旋转)

红黑树参考博客:

https://blog.csdn.net/qq_36610462/article/details/83277524

 

另外,关于数据结构和算法的基础文档有:
基础文档1

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM