Java二叉树基础操作常见代码例题
文章目录
- 前言
- 一、二叉树的节点和类定义
- 二、前、中、后序遍历
- 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二叉树基础操作常见代码例题相关推荐
- java 如何操作字节数组_实例解析Java字节数组操作模式代码
字节数组的关键是它为存储在这部分内存中的每个8位值提供索引(快速)和精确的原始访问,并且您可以操纵这些字节来控制每个位.缺点是计算机只将每个条目视为一个独立的8位数字--这可能是您的程序正在处理的,或 ...
- Java语言基础(常见对象3(数组排序(冒泡排序、选择排序、直接插入排序、快速排序、归并排序)、Arrays、基本数据类型包装类、Integer类、自动拆箱、自动装箱))
Java语言基础 常见对象 数组排序 冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值的元素就会出现在最大索引处:以此循环 //冒泡排序:public static void main(St ...
- Java 二叉树基础概念(递归迭代)
目录 1. 树型结构 1.1概念 1.2 概念(重要) 2. 二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 2.4 二叉树的性质 a.满二叉树 b.完全二叉树 2. ...
- Java并发—基础操作
原文地址:Java多线程看这一篇就足够了(吐血超详细总结) 目录 一.进程与线程 二.Java中线程实现的方式 三.线程的状态变化 四.线程的操作方法 五.同步以及死锁 六.总结 一.进程与线程 进程 ...
- Java多线程基础-9:代码案例之阻塞队列
阻塞队列是一种特殊的队列,带有"阻塞特性",也遵守队列 "先进先出" 的原则.阻塞队列是一种线程安全的数据结构,并且具有以下特性: 当队列满时,继续入队列就会阻 ...
- 【数据结构】- 二叉树基础操作
import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Queue ...
- java入门基础知识示例代码
本次更新给大家带来java的入门基础知识相关学习代码 模块一:java程序里的数据书写格式 package com.jiawei.literal;public class LiteralDemo {p ...
- Java 图片 基础操作
文章目录 图片读写 读 写 小总结 像素操作 属性操作 缩放 格式转换 其他 统一缩放每个像素的值 执行仿射变换 执行卷积 获取支持读取的文件格式 获取支持写入的文件格式 参考 图片读写 读 impo ...
- dout java_一段关于Java文件流操作的代码问题
小弟在初学阶段,为什么这段代码写到txt文件中之后是乱码呢.我看参考答案上面也是用的writeInt来写的.向各位高手请教解决之道.还有就是小弟积分少,没多少积分拿来悬赏.谢谢各位大侠了. impor ...
- java取服务器时间的函数,非常有用的Java日期时间操作函数代码一览
/** 日期类 * @date * @version 1.0 */ import java.util.*; import java.text.*; import java.util.Calendar; ...
最新文章
- 【一】TSP、VRP、VRP模型介绍
- Windows下安装Object C开发环境,及Hello Word(转)
- ubuntu安装php-curl拓展
- notepad设置中文
- keras训练完以后怎么预测_还在使用“龟速”的单显卡训练模型?动动手,让TPU节省你的时间...
- Java输入若干整数(不少于10个),用–1结束输入,以每行三个数的形式输出,再从这些数中选出所有奇数放在另一个数组中,然后输出.
- 用python画圣诞树-圣诞节!教你用 Python 画棵圣诞树
- windows虚拟显示器SDK开发和提供
- PreferenceScreen 的使用
- 分布式渲染运行时3D引擎架构在Web端的应用: 秒开3D Web APP
- python用户画像_python用户画像
- 电脑BIOS为UEFI BIOS,出现蓝屏情况“你的设备遇到问题,需要重启。我们只收集某些错误信息,然后你可以重新启动。100%完成“,解决方法。
- python可视化:Plotting with pandas and seaborn
- G - A Question of Ingestion Gym - 101673G
- 罗技键盘的insert键需要按住Fn才能生效?教你修改!
- C语言LMS双麦克风消噪算法,基于两个时域LMS算法双麦克风系统分析.doc
- 调用阿里短信通知平台
- plsql取消文件备份
- 使用键盘发布手柄控制信息
- 2021最新支持APP|公众号聊天在线客服程序源码
热门文章
- 【初学大数据】CentOS7安装hadoop3.3.2完全分布式详细流程
- QT入门(一)——QT概述
- 输入法突然变成繁体字的解决方法
- 提高计算机CPU运行速度,提高cpu运行速度的方法
- ab变频器22b用户手册_AB变频器 PowerFlex400用户手册.pdf
- BeanAir无线传感器方案
- MBA-day16 数学-应用题-集合问题-公式
- java 排秩,lamd(java lambda表达式)
- PROFINET转EtherCAT网关方案设计
- 计算机改桌面存储地址,c盘桌面路径改为d盘(怎样更改电脑桌面存储路径)