文章目录

  • 前言
  • 一、二叉树的节点和类定义
  • 二、前、中、后序遍历
    • 2.1前序遍历
    • 2.2中序遍历
    • 2.3后序遍历
  • 三、求二叉树节点个数
    • 3.1遍历思路
    • 3.2子问题思路
  • 四、求叶子节点个数
    • 4.1遍历思路
    • 4.2子问题思路
  • 五、求第k层节点个数
  • 六、获取二叉树高度
  • 七、检测值为value的节点是否存在
  • 八、判断一个树是不是完全二叉树
  • 九、层序遍历

前言

二叉树是我们数据结构非常重要的知识,平时的考试和面视也经常有所涉及,今天笔者给大家整理了常见的java二叉树基础操作代码,希望读者学有所成


提示:以下是本篇文章正文内容,下面案例可供参考

一、二叉树的节点和类定义

我们这里简单创建一棵如下的树:

代码如下(示例):

class BTNode{//节点public char val;public BTNode left;//左孩子的引用public BTNode right;//右孩子的引用public BTNode(char val){this.val=val;}
}
public class BinaryTree {//二叉树类public BTNode root;//二叉树根节点public BTNode createTree(){BTNode A=new BTNode('A');BTNode B=new BTNode('B');BTNode C=new BTNode('C');BTNode D=new BTNode('D');BTNode E=new BTNode('E');BTNode F=new BTNode('F');BTNode G=new BTNode('G');BTNode H=new BTNode('H');A.left=B;A.right=C;B.left=D;B.right=E;C.left=F;C.right=G;E.right=H;return A;}

二、前、中、后序遍历

2.1前序遍历

代码如下(示例):

//前序遍历——根左右void preOrder(BTNode root){if(root==null){return;}System.out.print(root.val+" ");preOrder(root.left);preOrder(root.right);}

2.2中序遍历

代码如下(示例):

//中序遍历——左根右void inOrder(BTNode root){if(root==null){return;}inOrder(root.left);System.out.print(root.val+" ");inOrder(root.right);}

2.3后序遍历

代码如下(示例):

//后序遍历——左右根void postOrder(BTNode root){if(root==null){return;}postOrder(root.left);postOrder(root.right);System.out.print(root.val+" ");}

小技巧:不用刻意记住顺序,左永远在右前面,然后“根”随着前中后改变,比如前序遍历,就是根最前面,然后左右——根左右。同样的中序:根在中间,左根右;后序以此类推。

测试用例如下:

public static void main(String[] args) {BinaryTree binaryTree=new BinaryTree();BTNode root=binaryTree.createTree();binaryTree.preOrder(root);//A B D E H C F GSystem.out.println();binaryTree.inOrder(root);//D B E H A F C GSystem.out.println();binaryTree.postOrder(root);//D H E B F G C A
}

打印结果如下:


三、求二叉树节点个数

3.1遍历思路

//遍历思路:定义一个计数器count,遍历二叉树,如果是节点,则count++,遍历方法前中后序都可以
int count=0;//count不能放到函数里面,因为你放到函数里面,每次递归都会变成0
int size(BTNode root){if(root==null){return 0;}count++;size(root.left);size(root.right);return count;
}

3.2子问题思路

//子问题思路:左树节点+右树节点=整棵树节点
int size(BTNode root){if(root==null){return 0;}else{return size(root.left)+size(root.right)+1;//加1是算上自己}
}

测试用例如下:

public static void main(String[] args) {BinaryTree binaryTree=new BinaryTree();BTNode root=binaryTree.createTree();int size=binaryTree.size(root);System.out.println(size);//打印8}

四、求叶子节点个数

4.1遍历思路

    //遍历思路:遍历到叶子节点,count++int count=0;//count同样不能放到方法里面,原因同题三int getLeafNodeCount(BTNode root){if(root==null){return 0;}else if(root.left==null&&root.right==null){count++;return count;}getLeafNodeCount(root.left);getLeafNodeCount(root.right);return count;}

4.2子问题思路

    //子问题思路:左树的叶子+右树的叶子=整棵树叶子int getLeafNodeCount(BTNode root){if(root==null){return 0;}else if(root.left==null&&root.left==null){return 1;}return getLeafNodeCount(root.left)+getLeafNodeCount(root.right);}

测试用例如下:

public static void main(String[] args) {BinaryTree binaryTree=new BinaryTree();BTNode root=binaryTree.createTree();int LeafNodeCount= binaryTree.getLeafNodeCount(root);System.out.println(LeafNodeCount);//4}

五、求第k层节点个数

    //获取第k层节点个数//思路:求第K层节点个数,就是求左子树第k-1层和右子树第k-1层个数和int getKLevelNodeCount(BTNode root,int k){if(root==null){return 0;}if(k==1){return 1;}return getKLevelNodeCount(root.left,k-1)+getKLevelNodeCount(root.right,k-1);}

测试用例如下:

public static void main(String[] args) {BinaryTree binaryTree=new BinaryTree();BTNode root=binaryTree.createTree();int get1LevelCount= binaryTree.getKLevelNodeCount(root, 1);System.out.println(get1LevelCount);//1int get2LevelCount= binaryTree.getKLevelNodeCount(root, 2);System.out.println(get2LevelCount);//2int get3LevelCount= binaryTree.getKLevelNodeCount(root, 3);System.out.println(get3LevelCount);//4int get4LevelCount= binaryTree.getKLevelNodeCount(root, 4);System.out.println(get4LevelCount);//1}

六、获取二叉树高度

    //获取二叉树的高度//思路:左数高度和右树高度比较,取最大值,最后+1(最大值是子树高度,还要算上根)int getHeight(BTNode root){if(root==null){return 0;}else{int maxLeft=getHeight(root.left);int maxRight=getHeight(root.right);return maxLeft>maxRight?maxLeft+1:maxRight+1;//法二:上面三行代码换成下面这行//return getHeight(root.left)>getHeight(root.right)?getHeight(root.left)+1:getHeight(root.right)+1;//三目运算符,左树高度比右树高度大,就返回左数高度,否则就是右树高度,最后+1//三目运算符这种写法,在树比较大的时候时间复杂度很大(重复递归了左树和右树最大高度),建议还是上面的写法}}

测试用例如下:

public static void main(String[] args) {BinaryTree binaryTree=new BinaryTree();BTNode root=binaryTree.createTree();int height= binaryTree.getHeight(root);System.out.println(height);//4}

七、检测值为value的节点是否存在

    //检测值为value的节点是否存在//思路:遍历二叉树中的节点,判断该节点中有没有我要找到数据,如果没有就去子树找(先左还是先右你自己选)BTNode find(BTNode root,int val){if(root==null){return null;}else if(root.val==val){return root;}else{BTNode ret1=find(root.left,val);if(ret1!=null){//!=null说明找到了return ret1;}BTNode ret2=find(root.right,val);if(ret2!=null){return ret2;}//走到这里还是没有return出去,说明左右子树都没有找到return null;}}

测试用例如下:

public static void main(String[] args) {BinaryTree binaryTree=new BinaryTree();BTNode root=binaryTree.createTree();BTNode ret1= binaryTree.find(root,'c');System.out.println(ret1);//nullBTNode ret2= binaryTree.find(root,'C');System.out.println(ret2);//BTNode@1b6d3586(C地址)System.out.println(ret2.val);//C}

八、判断一个树是不是完全二叉树

我先通过两个简单的树给大家说一下思路:
树1(完全二叉树)

先把A放到队列里面

然后出掉A,把A的左右节点BC放到队列里面

然后出掉B,把B的左右节点DE放到队列里面

出掉C,把C的左节点F和一个null(没有右节点)放到队列里

出掉D,放两个null进队列

出掉E,放两个null进队列

出掉F,放两个null进队列

弹出null的时候结束循环
我们发现,完全二叉树最后出的队列里面只剩下null
树2(非完全二叉树):
这里时间有限,举一个简单的非完全二叉树

我们把A放到队列里面

出掉A,放入A左右节点null(没有左节点)和B

弹出null的时候循环结束,发现队列里面不全是null,就不是完全二叉树

具体代码实现如下:

boolean isCompleteTree(BTNode root){if(root==null){return true;}Queue<BTNode>queue=new LinkedList<>();queue.offer(root);//offer效果和add一样,向队列里面添加元素while(!queue.isEmpty()){BTNode cur= queue.poll();//弹出队列首个元素,赋值给curif(cur!=null){queue.offer(cur.left);queue.offer(cur.right);}else {break;}}while(!queue.isEmpty()){//判断队列里面的剩余元素是不是全空(全空为完全二叉树,不然就不是)BTNode top= queue.peek();//取队头元素(不删除)if(top!=null){return false;}queue.poll();//弹出队头元素(删除)}return true;//走完while说明原先队列剩余元素都是null,也就是完全二叉树}

测试用例如下:

public static void main(String[] args) {BinaryTree binaryTree=new BinaryTree();BTNode root=binaryTree.createTree();boolean isC=binaryTree.isCompleteTree(root);System.out.println(isC);//false}

九、层序遍历

思路和上面判断是不是完全二叉树一样

//层序遍历//思路,创建一个队列,往队列里面放根节点,然后出掉根节点,放入左右结点,//出掉队头节点,放入队头节点左右节点//出掉队头节点,放入队头节点左右节点//出掉队头节点,放入队头节点左右节点//...public void levelOrder(BTNode root){if(root==null){return ;}Queue<BTNode>queue=new LinkedList<>();queue.offer(root);//offer效果和add一样,向队列里面添加元素while(!queue.isEmpty()){BTNode cur= queue.poll();//弹出队列首个元素,赋值给curif(cur!=null){System.out.print(cur.val+" ");queue.offer(cur.left);queue.offer(cur.right);}else {break;}}}

测试用例如下:

public static void main(String[] args) {BinaryTree binaryTree=new BinaryTree();BTNode root=binaryTree.createTree();binaryTree.levelOrder(root);}

Java二叉树基础操作常见代码例题相关推荐

  1. java 如何操作字节数组_实例解析Java字节数组操作模式代码

    字节数组的关键是它为存储在这部分内存中的每个8位值提供索引(快速)和精确的原始访问,并且您可以操纵这些字节来控制每个位.缺点是计算机只将每个条目视为一个独立的8位数字--这可能是您的程序正在处理的,或 ...

  2. Java语言基础(常见对象3(数组排序(冒泡排序、选择排序、直接插入排序、快速排序、归并排序)、Arrays、基本数据类型包装类、Integer类、自动拆箱、自动装箱))

    Java语言基础 常见对象 数组排序 冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值的元素就会出现在最大索引处:以此循环 //冒泡排序:public static void main(St ...

  3. Java 二叉树基础概念(递归迭代)

    目录 1. 树型结构 1.1概念 1.2 概念(重要) 2. 二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 2.4 二叉树的性质 a.满二叉树 b.完全二叉树 2. ...

  4. Java并发—基础操作

    原文地址:Java多线程看这一篇就足够了(吐血超详细总结) 目录 一.进程与线程 二.Java中线程实现的方式 三.线程的状态变化 四.线程的操作方法 五.同步以及死锁 六.总结 一.进程与线程 进程 ...

  5. Java多线程基础-9:代码案例之阻塞队列

    阻塞队列是一种特殊的队列,带有"阻塞特性",也遵守队列 "先进先出" 的原则.阻塞队列是一种线程安全的数据结构,并且具有以下特性: 当队列满时,继续入队列就会阻 ...

  6. 【数据结构】- 二叉树基础操作

    import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Queue ...

  7. java入门基础知识示例代码

    本次更新给大家带来java的入门基础知识相关学习代码 模块一:java程序里的数据书写格式 package com.jiawei.literal;public class LiteralDemo {p ...

  8. Java 图片 基础操作

    文章目录 图片读写 读 写 小总结 像素操作 属性操作 缩放 格式转换 其他 统一缩放每个像素的值 执行仿射变换 执行卷积 获取支持读取的文件格式 获取支持写入的文件格式 参考 图片读写 读 impo ...

  9. dout java_一段关于Java文件流操作的代码问题

    小弟在初学阶段,为什么这段代码写到txt文件中之后是乱码呢.我看参考答案上面也是用的writeInt来写的.向各位高手请教解决之道.还有就是小弟积分少,没多少积分拿来悬赏.谢谢各位大侠了. impor ...

  10. java取服务器时间的函数,非常有用的Java日期时间操作函数代码一览

    /** 日期类 * @date * @version 1.0 */ import java.util.*; import java.text.*; import java.util.Calendar; ...

最新文章

  1. 【一】TSP、VRP、VRP模型介绍
  2. Windows下安装Object C开发环境,及Hello Word(转)
  3. ubuntu安装php-curl拓展
  4. notepad设置中文
  5. keras训练完以后怎么预测_还在使用“龟速”的单显卡训练模型?动动手,让TPU节省你的时间...
  6. Java输入若干整数(不少于10个),用–1结束输入,以每行三个数的形式输出,再从这些数中选出所有奇数放在另一个数组中,然后输出.
  7. 用python画圣诞树-圣诞节!教你用 Python 画棵圣诞树
  8. windows虚拟显示器SDK开发和提供
  9. PreferenceScreen 的使用
  10. 分布式渲染运行时3D引擎架构在Web端的应用: 秒开3D Web APP
  11. python用户画像_python用户画像
  12. 电脑BIOS为UEFI BIOS,出现蓝屏情况“你的设备遇到问题,需要重启。我们只收集某些错误信息,然后你可以重新启动。100%完成“,解决方法。
  13. python可视化:Plotting with pandas and seaborn
  14. G - A Question of Ingestion Gym - 101673G
  15. 罗技键盘的insert键需要按住Fn才能生效?教你修改!
  16. C语言LMS双麦克风消噪算法,基于两个时域LMS算法双麦克风系统分析.doc
  17. 调用阿里短信通知平台
  18. plsql取消文件备份
  19. 使用键盘发布手柄控制信息
  20. 2021最新支持APP|公众号聊天在线客服程序源码

热门文章

  1. 【初学大数据】CentOS7安装hadoop3.3.2完全分布式详细流程
  2. QT入门(一)——QT概述
  3. 输入法突然变成繁体字的解决方法
  4. 提高计算机CPU运行速度,提高cpu运行速度的方法
  5. ab变频器22b用户手册_AB变频器 PowerFlex400用户手册.pdf
  6. BeanAir无线传感器方案
  7. MBA-day16 数学-应用题-集合问题-公式
  8. java 排秩,lamd(java lambda表达式)
  9. PROFINET转EtherCAT网关方案设计
  10. 计算机改桌面存储地址,c盘桌面路径改为d盘(怎样更改电脑桌面存储路径)