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
