文章目录

  • 摘要
  • 代码
    • Node节点
    • main函数
    • 问题1:递归——求二叉树的最大深度
    • 问题2:求二叉树的最小深度
    • 问题3:求二叉树中节点的个数
    • 问题4:求二叉树中叶子节点的个数
    • 问题5:求二叉树中第k层节点的个数,不是求第k层叶子节点个数
    • 问题6:判断两棵树是否相同
    • 问题7:给定一个二叉树,检查它是否是镜像对称的。
    • 问题8:(递归)二叉树的前序遍历
    • 问题9:(递归)二叉树的中序遍历
    • 问题10:(递归)二叉树的后序遍历
  • 本人其他文章链接

摘要

  1. 问题1:求二叉树的最大深度
  2. 问题2:求二叉树的最小深度
  3. 问题3:求二叉树中节点的个数
  4. 问题4:求二叉树中叶子节点的个数
  5. 问题5:求二叉树中第k层节点的个数(不是求第k层叶子节点个数)
  6. 问题6:判断两棵树是否相同
  7. 问题7:给定一个二叉树,检查它是否是镜像对称的。
  8. 问题8:(递归)二叉树的前序遍历
  9. 问题9:(递归)二叉树的中序遍历
  10. 问题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 二叉树面试题相关推荐

  1. 蘑菇街2015校招 Java研发笔试题 详解,2015java

    蘑菇街2015校招 Java研发笔试题 详解,2015java 1. 对进程和线程描述正确的是( ) A.  父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间. B.  改变 ...

  2. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

  3. Java中高级面试题 -- 数十道题含答案

    Java中高级面试题 一.基础知识: 1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList:HashSet,TreeSet): ArrayList ...

  4. JAVA基础面试题,java高级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  5. 100道Java中高级面试题汇总+详细拆解

    出自:Java面试题精选 1-10期 [10期]Redis 面试常见问答 [09期]说说hashCode() 和 equals() 之间的关系? [08期]说说Object类下面有几种方法呢? [07 ...

  6. 计算机java语言答案,2019年全国计算机二级Java语言练习试题及答案一

    [摘要]备考全国计算机二级Java语言考试的小伙伴们,知识点掌握的都怎么样了呢?环球网校小编整理了2019年全国计算机二级Java语言练习试题及答案供大家参考复习,小伙伴们快来做一做,测试一下自己吧! ...

  7. Java 超全面试题

    数据库&事务 1.什么样的场景会产生数据库死锁,如何解决? 2.SQL如何优化 3.Oracle和mysql分页的实现原理 4.唯一索引能否插入空 5.数据库索引的算法原理 6.乐观锁,悲观锁 ...

  8. Java中高级面试题部分答案解析

    Java中高级面试题部分答案解析 List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦 ...

  9. 无内鬼来点干货,银行java开发面试题(含答案)

    目录 前言 1.在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? 2.不重写Bean的hashCode()方法是否会对性能带来影响? 3.对于一个不可修改的 ...

  10. 2021年Java高级面试题总结

    零基础如何学习Java? 首先,你要明白一点,Java入门不难! 无论你是从事哪个行业,兴趣一定是最好的老师,也是你学习的动力. 学习方式1:自学 自学模式其实我个人不建议绝大部分的人选择,因为自学是 ...

最新文章

  1. vue = 什么意思_Vue 00 —— 初识 Vue,从放弃到入门
  2. git clone 加速小技巧
  3. zabbix自动发现规则实现批量监控主机的TCP监听端口
  4. Linux文件权限符号含义
  5. java 入门-helloWorld
  6. android 自定义view实现拖动放大缩小_自定义itemClickView
  7. oracle status
  8. FastDFS(分布式文件系统)
  9. 淘汰Hyper-V replication 拥抱Storage Replica
  10. MS UC 2013-0-Prepare Tool
  11. 基于Docker的Mysql主从复制
  12. Axure Mac汉化
  13. matlab图例双字体设置
  14. Java - 类与对象
  15. ERROR: Cannot uninstall ‘PyYAML‘. It is a distutils installed project and thus we cannot accurately
  16. 【JPress】Menu
  17. 阿里云短信发送接口直接HTTP请求调用
  18. 第三类边界条件 matlab,matlab怎么解偏微分方程
  19. Android制作简单的计算器
  20. 求最小公倍数【牛客网】

热门文章

  1. 【测评】思维导图的战争!手绘和数字思维导图哪个更实用?
  2. windows下运行bochs
  3. 详解KVM虚拟化原理
  4. 如何压缩pdf文件的大小?
  5. JavaCV入门使用
  6. 震惊!!【微信拼图红包】继微信语音红包后又一新技能
  7. 尚硅谷Java Spring注解驱动开发视频教程
  8. CryptoJS 加密
  9. 希捷硬盘维修工具 v5.10.6 绿色免费版
  10. Tcl 语言——Synopsys Tcl篇