文章目录

  • 摘要
  • 代码
    • 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. 小型直流电机内部结构
  2. c++局部对象是什么_面向对象三大特征: 封装
  3. SharePoint 2010 BI(2):使用Visio“.NET研究” Service
  4. mysql1.8找回密码_PHP+Mysql+jQuery找回密码
  5. 1.关于UltraEdit中的FTP和Tenent配置,UE远程连接Linux进行文件操作
  6. 让模块支持“导入”“导出”功能
  7. 实现连麦_直播课程系统如何实现互动连麦效果?
  8. bzoj2818: Gcd
  9. 【笔记 】weex POST请求 body数据服务器获取不到
  10. 如何在 SQL Server 2005 故障转移群集中添加或删除节点(安装程序)
  11. 去A片马赛克,开发者被抓了。
  12. 【转载】MATLAB入门书籍推荐
  13. 制作u盘winpe启动盘_U盘PE启动盘制作方法
  14. 该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。
  15. QTableWidgetItem
  16. 一 . css系列之html需知及ps的基础操作
  17. 智能家居研究:深耕用户体验实现核心业务17.3%增长
  18. WINDOWS渗透与提权总结(2)
  19. 【spring 的 init and destory 方法】
  20. DRAM的一些电压参数VDD VDDQ VPP剖析

热门文章

  1. 风险模型—VaR模型2
  2. ahk写入excel单元格_AHK(二):设置Excel操作快捷键
  3. vm虚拟机做为pxe服务器,vm esxi创建的虚拟机怎么通过pxe启动
  4. AWS环境搭建(六):Linux上部署wowza,并配置ssl证书
  5. 模糊控制(一)模糊控制简介及数学基础
  6. 第四章 ,数据处理--学习笔记
  7. linux命令行里输入nyancat,好玩的Linux命令行,与彩虹猫Nyan Cat一起休息下
  8. Linux平台(Ubuntu或者树莓派)上下载磁力链接;使用Deluge下载
  9. php 电梯程序设计,plc在电梯自动控制中的应用编程实例
  10. qca9535 tftp32 刷机_【U-Boot】U-Boot 刷机方法大全