难易程度:★★★

重要性:★★★★★

今日头条的面试中有过要求:手写实现BST

import java.util.*;public class MyBSTImpl {// BST中的节点TreeNode root;static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}}// 插入操作public void insertIntoBST(int val) {root = insertIntoBST(root, val);}private TreeNode insertIntoBST(TreeNode root, int val) {if (root == null) {root = new TreeNode(val);return root;}if (val < root.val)root.left = insertIntoBST(root.left, val);else if (val > root.val)root.right = insertIntoBST(root.right, val);return root;}/** 待删除节点可能有四种情况:* 1.待删除节点:没有左孩子也没有右孩子,删除节点后return null即可* 2.待删除节点:只有左孩子,删除节点后return 该节点的左子树即可* 3.待删除节点:只有右孩子,删除节点后return 该节点的右子树即可* 4.待删除节点:左孩子和右孩子都不为null:用待删除节点的右子树中最小的节点值,*   也就是用待删除节点的右子树最左端的节点值替换待删除节点的值,然后删除待删除节点的右子树最左端的节点即可*   (该节点没有左孩子),因为是最左端节点。*/public void deleteNode(int val) {root = deleteNode(root, val);}private TreeNode deleteNode(TreeNode curNode, int key) {if (curNode == null) {return null;}if (key < curNode.val) {curNode.left = deleteNode(curNode.left, key);} else if (key > curNode.val) {curNode.right = deleteNode(curNode.right, key);} else {// curNode为带输出节点if (curNode.left == null) {// 待删除节点只有右孩子或者没有孩子节点return curNode.right;} else if (curNode.right == null) {// 待删除节点只有左孩子return curNode.left;}// 左右孩子都有// 找到待删除节点右子树中最left的节点,也就是右子树中值最小的节点TreeNode minNode = findMin(curNode.right);curNode.val = minNode.val;// 更新curNode的值为待删除节点右子树中值最小的节点的值// 删除curNode右子树中值最left的节点curNode.right = deleteNode(curNode.right, curNode.val);}return curNode;}// 找到以node为根节点的所有节点中值最小的节点,也就是最左端的节点private TreeNode findMin(TreeNode node) {while (node.left != null) {node = node.left;}return node;}// 迭代的方式刪除private TreeNode deleteNode1(TreeNode root, int key) {TreeNode cur = root;TreeNode pre = null;while (cur != null) {pre = cur;if (key < cur.val) {cur = cur.left;} else if (key > cur.val) {cur = cur.right;} elsebreak;}// cur指向待删除节点if (cur == null)return null;// 没找到待删除节点if (pre == null) {// 删除根节点root = deleteRootNode(cur);} else if (pre.left == cur) {// 删除左节点pre.left = deleteRootNode(cur);} else {// 删除有节点pre.right = deleteRootNode(cur);}return root;}private TreeNode deleteRootNode(TreeNode root) {if (root == null) {return null;}if (root.left == null) {return root.right;}if (root.right == null) {return root.left;}TreeNode next = root.right;TreeNode pre = root;// next指向待删除节点的右分支最小节点// pre指向next的父节点for (; next.left != null; pre = next, next = next.left);next.left = root.left;if (root.right != next) {// 不是要删除next节点本身pre.left = next.right;next.right = root.right;}return next;}//查找操作public int searchBST(int val) {TreeNode search = searchBST(root, val);return search == null ? -1 : search.val;}// 递归查找private TreeNode searchBST(TreeNode root, int val) {if (root == null || root.val == val)return root;if (val > root.val)return searchBST(root.right, val);elsereturn searchBST(root.left, val);}// 迭代查找private TreeNode searchBST1(TreeNode root, int val) {if (root == null) {return null;}while (true) {if (root.val == val) {return root;} else if (root.val < val) {root = root.right;} else {root = root.left;}if (root == null) {return null;}}}
}
复制代码

推荐阅读

java学习笔记、10T资料、100多个java项目分享


扫描下方二维码,及时获取更多互联网求职面经javapython爬虫大数据等技术,和海量资料分享: 公众号**菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务; 公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料**、java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有

转载于:https://juejin.im/post/5cbd75d7f265da03b8584f31

java手写实现BST相关推荐

  1. java 手写 jvm高性能缓存

    java 手写 jvm高性能缓存,键值对存储,队列存储,存储超时设置 缓存接口 1 package com.ws.commons.cache; 2 3 import java.util.functio ...

  2. Java 手写一个SQL分页

    Java手写一个类似PageHelper的分页SQL 目前分页插件众所周知的莫过于和mybatis完美融合的PageHelper了,简单两行代码就实现了sql分页,配合PageInfo类,将数据总数量 ...

  3. Java手写线程池-第一代(原创)

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 Java手写线程池(第一代) ...

  4. Java 手写签字去除背景 背景透明

    Java 手写签字去除背景 背景透明 /*** 白底照片去除白底 形成透明底图片* @param file 需要去除背景的图片* @param Path 去除背景后保存图片的路径* @return t ...

  5. 纯jsp实现评论功能_自己实现的java手写tomcat

    这是一个java写的模拟tomcat工作原理的demo,是一个极简的tomcat服务器,也是我们培训班(邦邦IT教育)的讲义,是整个j2ee培训的精髓,理解了这个demo其实后面的很多东西都是可以自学 ...

  6. Java手写HashSet

    一:引言 HashSet类继承于 Set接口 其方法均可被直接调用,不用手写,本篇敲的码是为了熟悉底层原理,HashMap的特点:无序,无重复.其底层用的也是map<key,value>容 ...

  7. Java手写Hashmap(HashMap的基本用法)

    一:引言 HashMap是Map的实现类,其方法都可以继承Map,不用手写,本篇只是为了了解底层代码和复习java基础敲得码 二:上码 package cn.wyj.two;public class ...

  8. JAVA手写ArrayList以及LinkedList

    手写记录一下~ 顶级接口List public interface List<E> {//返回线性表的大小public int getSize();//判断线性表中是否为空public b ...

  9. 高级JAVA - 手写简单的重试组件学习Spring Retry

    目录 一 . 定义注解 二 . 利用cglib代理扩展重试业务 三 . 编写代理类 , 使用自定义的XRetryInterceptor作为拦截器 四 . 编写相关业务方法 , 测试代码 五 . 测试结 ...

最新文章

  1. 敏捷开发必备的管理工具
  2. 局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归
  3. web前端学习day_02:CSS:三种使用方式/选择器/颜色/背景图片/查看样式/文本/元素显示方式/盒子模型/定位方式/行内对齐/显示层级/防溢出
  4. 大数问题(高精度运算)
  5. Repeater嵌套绑定Repeater
  6. basemap安装_Python画地图逃不过的basemap「完全安装手册」 | 附下载
  7. bzoj1699[Usaco2007 Jan]Balanced Lineup排队
  8. 3.1_ 6_ 基本分页存储管理的基本概念
  9. 复习:关于类的继承和构造函数
  10. ubuntu 20 /CentOS 8.x/MAC 系统 中安装GO LANG(GO语言)
  11. 由《资深架构师带你玩转框架封装》课程——我的实践
  12. C++对BIL格式遥感影像读取
  13. linux dosbox使用教程,dosbox安装及汇编教程 dosbox的常用快捷键
  14. ysoserial exploit/JRMPClient
  15. 阿里建直营物流,“三通一达”要被踢出局了?
  16. Xftp的下载和安装(超详细)
  17. Conflux 联合创始人、CTO伍鸣博士出席杭州钱江世纪城重点发展企业座谈会
  18. 【TUM公开数据集RGBD-Benchmark工具evaluate_rpe.py参数用法原理解读】
  19. 电容麦克风的幻象供电
  20. The fifth day

热门文章

  1. react 显示当前时间_React获取最近三个月的日期组件
  2. 系统页面升级系统中_国产系统哪家强?华为EMUI系统大升级,拿下最强指日可待...
  3. 基本类型数组转包装类型数组工具类
  4. linux svn apt get,Ubuntu下安装SVN客户端
  5. 【LeetCode】TreeNode类实现解析(java实现)
  6. 几种流行Webservice控制框架
  7. UIView的生命周期
  8. WindowsServer2012史记5-简洁,管理更多的服务器
  9. 20佳精美404错误页面设计欣赏
  10. LeetCode刷题: 整数反转