应届毕业生java面试题库及答案,不是吧,持续更新中

  • 如果有

  • r.parent = p.parent
    
  • 还要设置 r为 p.parent 的子节点(可能左也可能右)
    
  • 如果 p.parent.left == p
    
  •    p.parent.left = r;
    
  • 否则
    
  •    p.parent.right = r;
    
  • 最后

  •   p.parent = r;
    
  •   r.left = p;
    
  • @param p

*/

private void leftRotate(RBNode p){

if(p != null){

RBNode r = p.right;

// 1.设置 pr-rl 要变为 p-rl

// 把rl设置到p的右子节点

p.right = r.left;

if(r.left != null){

// 设置rl的父节点为p

r.left.parent = p;

}

// 2.判断p的父节点情况

r.parent = p.parent; // 不管 p是否有父节点,都把这个父节点设置为 r的父节点

if(p.parent == null){

root = r; // p没有父节点 则r为root节点

}else if(p.parent.left == p){

p.parent.left = r; // 如果p为 p.parent的左子节点 则 r 也为 p.parent的左子节点

}else{

p.parent.right = r; // 反之设置 r 为 p.parent的右子节点

}

// 最后 设置 p 为 r 的左子节点

r.left = p;

p.parent = r;

}

}

复制代码

右旋实现:

/**

  • 围绕p右旋

  • @param p

*/

public void rightRotate(RBNode p){

if(p != null){

RBNode r = p.left;

p.left = r.right;

if(r.right != null){

r.right.parent = p;

}

r.parent = p.parent;

if(p.parent == null){

root = r;

}else if(p.parent.left == p){

p.parent.left = r;

}else{

p.parent.right = r;

}

r.right = p;

p.parent = r;

}

}

复制代码

2 新增节点


2-3-4树中结点添加需要遵守以下规则:

  • 插入都是向最下面一层插入

  • 升元:将插入结点由 2-结点升级成 3-结点,或由 3-结点升级成 4-结点;

  • 向 4-结点插入元素后,需要将中间元素提到父结点升元,原结点变成两个 2-结点,再把元素插入2-结点中,如果父结点也是 4-结点,则递归向上层升元,至到根结点后将树高加1;

而将这些规则对应到红黑树里,就是:

  • 新插入的结点颜色为 红色 ,这样才可能不会对红黑树的高度产生影响。

  • 2-结点对应红黑树中的单个黑色结点,插入时直接成功(对应 2-结点升元)。

  • 3-结点对应红黑树中的 黑+红 子树,插入后将其修复成 红+黑+红 子树(对应 3-结点升元);

  • 4-结点对应红黑树中的 红+黑+红 子树,插入后将其修复成 红色祖父+黑色父叔+红色孩子 子树,然后再把祖父结点当成新插入的红色结点递归向上层修复,直至修复成功或遇到 root 结点;

公式:红黑树+新增一个节点(红色)**=**对等的2-3-4树+新增一个节点

2.1 新增节点示例

我们通过新增2-3-4树的过程来映射对应的红黑树的节点新增

å¨è¿éæå¥å¾çæè¿°

2-3-4树的新增(全部在叶子节点完成)

1.新增一个节点,2 节点

å¨è¿éæå¥å¾çæè¿°

2.新增一个节点,与2节点合并,直接合并

å¨è¿éæå¥å¾çæè¿°

3.新增一个节点,与3节点合并,直接合并

å¨è¿éæå¥å¾çæè¿°

插入的值的位置会有3种情况

对应的红黑树为:

å¨è¿éæå¥å¾çæè¿°

4.新增一个节点,与4节点合并,此时需要分裂、

å¨è¿éæå¥å¾çæè¿°

插入值的位置可能是

å¨è¿éæå¥å¾çæè¿°

对应的红黑树的结构为

å¨è¿éæå¥å¾çæè¿°

2.2 新增代码实现

红黑树的新增规则我们理清楚了,接下来就可以通过Java代码来具体的实现了。

先实现插入节点,这就是一个普通的二叉树的插入

/**

  • 新增节点

  • @param key

  • @param value

*/

public void put(K key , V value){

RBNode t = this.root;

if(t == null){

// 说明之前没有元素,现在插入的元素是第一个

root = new RBNode<>(key , value == null ? key : value,null);

return ;

}

int cmp ;

// 寻找插入位置

// 定义一个双亲指针

RBNode parent;

if(key == null){

throw new NullPointerException();

}

// 沿着跟节点找插入位置

do{

parent = t;

cmp = key.compareTo((K)t.key);

if(cmp < 0){

// 左侧找

t = t.left;

}else if(cmp > 0){

// 右侧找

t = t.right;

}else{

// 插入节点的值==比较的节点。值替换

t.setValue(value==null?key:value);

return;

}

}while (t != null);

// 找到了插入的位置 parent指向 t 的父节点 t为null

// 创建要插入的节点

RBNode<K, Object> e = new RBNode<>(key, value == null ? key : value, parent);

// 然后判断要插入的位置 是 parent的 左侧还是右侧

if(cmp < 0){

parent.left = e;

}else{

parent.right = e;

}

// 调整 变色 旋转

fixAfterPut(e);

}

复制代码

然后再根据红黑树的特点来实现调整(旋转,变色)

private boolean colorOf(RBNode node){

return node == null ? BLACK:node.color;

}

private RBNode parentOf(RBNode node){

return node != null ? node.parent:null;

}

private RBNode leftOf(RBNode node){

return node != null ? node.left:null;

}

private RBNode rightOf(RBNode node){

return node != null ? node.right:null;

}

private void setColor(RBNode node ,boolean color){

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!

金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

三面蚂蚁核心金融部,Java开发岗(缓存+一致性哈希+分布式)

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。**

[外链图片转存中…(img-JSGUL11R-1712507759525)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值