JAVA 二叉树面试题
文章目录
- 摘要
- 代码
- Node节点
- main函数
- 问题1:递归——求二叉树的最大深度
- 问题2:求二叉树的最小深度
- 问题3:求二叉树中节点的个数
- 问题4:求二叉树中叶子节点的个数
- 问题5:求二叉树中第k层节点的个数,不是求第k层叶子节点个数
- 问题6:判断两棵树是否相同
- 问题7:给定一个二叉树,检查它是否是镜像对称的。
- 问题8:(递归)二叉树的前序遍历
- 问题9:(递归)二叉树的中序遍历
- 问题10:(递归)二叉树的后序遍历
- 本人其他文章链接
摘要
- 问题1:求二叉树的最大深度
- 问题2:求二叉树的最小深度
- 问题3:求二叉树中节点的个数
- 问题4:求二叉树中叶子节点的个数
- 问题5:求二叉树中第k层节点的个数(不是求第k层叶子节点个数)
- 问题6:判断两棵树是否相同
- 问题7:给定一个二叉树,检查它是否是镜像对称的。
- 问题8:(递归)二叉树的前序遍历
- 问题9:(递归)二叉树的中序遍历
- 问题10:(递归)二叉树的后序遍历
代码
Node节点
import lombok.Data;/*** 二叉树数据结构* @author: liudz* @date: 2021/4/8*/
@Data
public class Node {int val;//节点数据Node left;//左子节点的引用Node right;//右子节点的引用public Node() {};public Node(int val) {this.val = val;left = null;right = null;}public Node(int val, Node left, Node right) {this.val = val;this.left = left;this.right = right;}
}
main函数
public static void main(String[] args){Node p1 = new Node(1, new Node(2), new Node());Node q1 = new Node(1, new Node(), new Node(2));/* a1:↓ a2:↓ a3:↓1 1 1/ \ / \2 3 2 3/ \4 5/6*/Node a1 = new Node(1, new Node(2, new Node(4), new Node(5, new Node(6), null)), new Node(3));Node a2 = new Node(1, null, null);Node a3 = new Node(1, new Node(2, null, null), new Node(3, null, null));//问题10:(递归)二叉树的后序遍历
// postOrderRe(a1).stream().forEach(item -> System.out.print(item + " "));//问题9:(递归)二叉树的中序遍历
// midOrderRe(a1).stream().forEach(item -> System.out.print(item + " "));//问题8:(递归)二叉树的前序遍历
// preOrderReverse(a1).stream().forEach(item -> System.out.print(item + " "));//问题5:求二叉树中第k层节点的个数(不是求第k层叶子节点个数)
// System.out.println("numsOfkLevelTreeNode:" + numsOfkLevelTreeNode(a1, 3));//问题4:求二叉树中叶子节点的个数
// System.out.println("numsOfNoChildNode:" + numsOfNoChildNode(a1));//问题3:求二叉树中节点的个数
// System.out.println("numOfTreeNode:" + numOfTreeNode(a1));//问题2:求二叉树的最小深度
// System.out.println("mintreeDepth:" + mintreeDepth(a1));//问题1:求二叉树的最大深度
// System.out.println("maxtreeDepth:" + maxtreeDepth(a1));//问题7:给定一个二叉树,检查它是否是镜像对称的。
// System.out.println(isSymmetric(p1, q1));//问题6:判断两棵树是否相同
// System.out.println(isSameTree(p1, q1));}
问题1:递归——求二叉树的最大深度
/*** 问题1:递归——求二叉树的最大深度* @param node node* @Author liudz * @Date 2021/6/29 * @return */public static int maxtreeDepth(Node node){if (node == null) {return 0;}return Math.max(maxtreeDepth(node.getLeft()), maxtreeDepth(node.getRight())) + 1;}
问题2:求二叉树的最小深度
/*** 问题2:求二叉树的最小深度* @param node node* @Author liudz* @Date 2021/6/29* @return*/public static int mintreeDepth(Node node){if (node == null) {return 0;}return Math.min(mintreeDepth(node.getLeft()), mintreeDepth(node.getRight())) + 1;}
问题3:求二叉树中节点的个数
/*** 问题3:求二叉树中节点的个数* @param node node* @Author liudz* @Date 2021/6/29* @return*/public static int numOfTreeNode(Node node){if (node == null) {return 0;}return numOfTreeNode(node.getLeft()) + numOfTreeNode(node.getRight()) + 1;}
问题4:求二叉树中叶子节点的个数
/*** 问题4:求二叉树中叶子节点的个数* @param node node* @Author liudz* @Date 2021/6/29* @return*/public static int numsOfNoChildNode(Node node){if (node == null) {return 0;}if (node.getLeft() == null && node.getRight() == null) {return 1;}return numsOfNoChildNode(node.getLeft()) + numsOfNoChildNode(node.getRight());}
问题5:求二叉树中第k层节点的个数,不是求第k层叶子节点个数
/*** 问题5:求二叉树中第k层节点的个数,不是求第k层叶子节点个数* @param node node* @Author liudz* @Date 2021/6/29* @return*/public static int numsOfkLevelTreeNode(Node node, int level){if (node == null || level <= 0) {return 0;}if (node != null && level == 1) {return 1;}return numsOfkLevelTreeNode(node.getLeft(), level-1) + numsOfkLevelTreeNode(node.getRight(), level-1);}
问题6:判断两棵树是否相同
/*** 问题6:判断两棵树是否相同* 思路:方法一:深度优先搜索* 如果两个二叉树都为空,则两个二叉树相同。* 如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。* 如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,* 若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。* 这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。* @param p p* @param q q* @author liudz* @date 2021/4/21* @return 执行结果**/public static boolean isSameTree(Node p, Node q) {if (p == null && q == null) {return true;} else if (p == null || q == null) {return false;} else if (p.getVal() != q.getVal()) {return false;} else {return isSameTree(p.getLeft(), q.getLeft()) && isSameTree(p.getRight(), q.getRight());}}
问题7:给定一个二叉树,检查它是否是镜像对称的。
/*** 问题7:给定一个二叉树,检查它是否是镜像对称的。* 思路:(类似判断两棵树是否相同)* 如果两个二叉树都为空,则两个二叉树相同。* 如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。* 如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,* 若相同,再分别判断一棵树的左子树和另一棵树的右子树是否相同* @author liudz* @date 2021/4/21* @return 执行结果**/public static boolean isSymmetric(Node p, Node q) {if (p == null && q == null) {return true;} else if (p == null || q == null) {return false;}else if (p.getVal() != q.getVal()) {return false;}return isSymmetric(p.getLeft(), q.getRight()) && isSymmetric(p.getRight(), q.getLeft());}
问题8:(递归)二叉树的前序遍历
/*** 问题8:(递归)二叉树的前序遍历* 问题:为啥分2个方法而不是写一个方法?* 答案:因为写一起每次ArrayList都会重新初始化,导致结果不对* 思路:封装递归方法* 1)根节点值添加list + 2)递归左节点 3)递归右节点* @param node node* @Author liudz* @Date 2021/6/29* @return*/public static List preOrderReverse(Node node){List list = new ArrayList();preOrder(node, list);return list;}public static void preOrder(Node node, List list) {if (node == null) {return;}list.add(node.getVal());preOrder(node.getLeft(), list);preOrder(node.getRight(), list);}
问题9:(递归)二叉树的中序遍历
/*** 问题9:(递归)二叉树的中序遍历* 问题:为啥分2个方法而不是写一个方法?* 答案:因为写一起每次ArrayList都会重新初始化,导致结果不对* @param node node* @Author liudz* @Date 2021/6/29* @return*/public static List midOrderRe(Node node){ArrayList list = new ArrayList();midOrder(node, list);return list;}public static void midOrder(Node node, List list) {if (node == null) {return;}midOrder(node.getLeft(), list);list.add(node.getVal());midOrder(node.getRight(), list);}
问题10:(递归)二叉树的后序遍历
/*** 问题10:(递归)二叉树的后序遍历* 问题:为啥分2个方法而不是写一个方法?* 答案:因为写一起每次ArrayList都会重新初始化,导致结果不对* @param node node* @Author liudz* @Date 2021/6/29* @return*/public static List postOrderRe(Node node){ArrayList list = new ArrayList();postOrder(node, list);return list;}public static void postOrder(Node node, List list) {if (node == null) {return;}postOrder(node.getLeft(), list);postOrder(node.getRight(), list);list.add(node.getVal());}
本人其他文章链接
1.单链表题+数组题(快慢指针和左右指针)
2.BFS(Breath First Search 广度优先搜索)
3.”回溯算法“框架及练习题
4.JAVA 二叉树面试题
JAVA 二叉树面试题相关推荐
- 蘑菇街2015校招 Java研发笔试题 详解,2015java
蘑菇街2015校招 Java研发笔试题 详解,2015java 1. 对进程和线程描述正确的是( ) A. 父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间. B. 改变 ...
- java面试题_阿里大厂流出的数百道 Java 经典面试题
BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...
- Java中高级面试题 -- 数十道题含答案
Java中高级面试题 一.基础知识: 1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList:HashSet,TreeSet): ArrayList ...
- JAVA基础面试题,java高级面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- 100道Java中高级面试题汇总+详细拆解
出自:Java面试题精选 1-10期 [10期]Redis 面试常见问答 [09期]说说hashCode() 和 equals() 之间的关系? [08期]说说Object类下面有几种方法呢? [07 ...
- 计算机java语言答案,2019年全国计算机二级Java语言练习试题及答案一
[摘要]备考全国计算机二级Java语言考试的小伙伴们,知识点掌握的都怎么样了呢?环球网校小编整理了2019年全国计算机二级Java语言练习试题及答案供大家参考复习,小伙伴们快来做一做,测试一下自己吧! ...
- Java 超全面试题
数据库&事务 1.什么样的场景会产生数据库死锁,如何解决? 2.SQL如何优化 3.Oracle和mysql分页的实现原理 4.唯一索引能否插入空 5.数据库索引的算法原理 6.乐观锁,悲观锁 ...
- Java中高级面试题部分答案解析
Java中高级面试题部分答案解析 List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦 ...
- 无内鬼来点干货,银行java开发面试题(含答案)
目录 前言 1.在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? 2.不重写Bean的hashCode()方法是否会对性能带来影响? 3.对于一个不可修改的 ...
- 2021年Java高级面试题总结
零基础如何学习Java? 首先,你要明白一点,Java入门不难! 无论你是从事哪个行业,兴趣一定是最好的老师,也是你学习的动力. 学习方式1:自学 自学模式其实我个人不建议绝大部分的人选择,因为自学是 ...
最新文章
- vue = 什么意思_Vue 00 —— 初识 Vue,从放弃到入门
- git clone 加速小技巧
- zabbix自动发现规则实现批量监控主机的TCP监听端口
- Linux文件权限符号含义
- java 入门-helloWorld
- android 自定义view实现拖动放大缩小_自定义itemClickView
- oracle status
- FastDFS(分布式文件系统)
- 淘汰Hyper-V replication 拥抱Storage Replica
- MS UC 2013-0-Prepare Tool
- 基于Docker的Mysql主从复制
- Axure Mac汉化
- matlab图例双字体设置
- Java - 类与对象
- ERROR: Cannot uninstall ‘PyYAML‘. It is a distutils installed project and thus we cannot accurately
- 【JPress】Menu
- 阿里云短信发送接口直接HTTP请求调用
- 第三类边界条件 matlab,matlab怎么解偏微分方程
- Android制作简单的计算器
- 求最小公倍数【牛客网】