Java最新基础二叉搜索树 - java - 细节狂魔,java电商项目面试问题

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取


直接实践

===================================================================

准备工作:定义一个树节点的类,和二叉搜索树的类。


在这里插入图片描述


搜索二叉树的查找功能


假设我们已经构造好了一个这样的二叉树,如下图

在这里插入图片描述

我们要思考的第一个问题是如何查找某个值是否在该二叉树中?

在这里插入图片描述

根据上述的逻辑,我们来把搜索的方法进行完善。

在这里插入图片描述


搜索二叉树的插入操作。


在这里插入图片描述

根据上述逻辑,我们来写一个插入节点的代码。

在这里插入图片描述


搜索二叉树 删除节点的操作 - 难点


在这里插入图片描述

再来分析一下:curDummy 和 parentDummy 是怎么找到“替罪羊”的。

在这里插入图片描述


总程序 - 模拟实现二叉搜索树



class TreeNode{

    public int val;

    public TreeNode left;

    public TreeNode right;

    public TreeNode(int val){

        this.val = val;

    }

}



public class BinarySearchTree {

    TreeNode root;



    //在二叉树中 寻找指定 val 值的节点

    // 找到了,返回其节点地址;没找到返回 null

    public TreeNode search(int key){

        TreeNode cur = this.root;

        while(cur != null){

            if(cur.val == key){

                return cur;

            }else if(cur.val < key){

                cur = cur.right;

            }else{

                cur = cur.left;

            }

        }

        return null;

    }

    // 插入操作

    public boolean insert(int key){

        if(this.root == null){

            this.root = new TreeNode(key);

            return true;

        }

        TreeNode cur = this.root;

        TreeNode parent = null;

        while(cur!=null){

            if(key > cur.val){

                parent  = cur;

                cur = cur.right;

            }else if(cur.val == key){

                return false;

            }else{

                parent  = cur;

                cur = cur.left;

            }

        }

        TreeNode node = new TreeNode(key);

        if(parent .val > key){

            parent.left = node;

        }else{

            parent.right = node;

        }

        return true;

    }

    // 删除操作

    public void remove(int key){

        TreeNode cur = root;

        TreeNode parent = null;

        // 寻找 删除节点位置。

        while(cur!=null){

            if(cur.val == key){

                removeNode(cur,parent);// 真正删除节点的代码

                break;

            }else if(cur.val < key){

                parent = cur;

                cur = cur.right;

            }else{

                parent = cur;

                cur = cur.left;

            }

        }

    }

    // 辅助删除方法:真正删除节点的代码

    private void removeNode(TreeNode cur,TreeNode parent){

        // 情况一

        if(cur.left == null){

            if(cur == this.root){

                this.root = this.root.right;

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

                parent.left = cur.right;

            }else{

                parent.right = cur.right;

            }

            // 情况二

        }else if(cur.right == null){

            if(cur == this.root){

                this.root = root.left;

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

                parent.left = cur.left;

            }else{

                parent.right = cur.left;

            }

            // 情况三

        }else{

            // 第二种方法:在删除节点的右子树中寻找最小值,

            TreeNode parentDummy = cur;

            TreeNode curDummy = cur.right;

            while(curDummy.left != null){

                parentDummy = curDummy;



## 最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

![image](https://img-blog.csdnimg.cn/img_convert/38a4b61448f2acb3c57132350d9a397f.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

rDummy.left != null){

                parentDummy = curDummy;



## 最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

[外链图片转存中...(img-4u1Y4BRe-1715429794267)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值