实现二叉树的基本操作(Java版)
近期研究了一下二叉树,试着用Java语言实现了二叉树的基本操作,下面分享一下实现代码:
package com.sf.test; import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Stack; public class TreeMain { public static void main(String[] agrs) {
int[] arr = {5,17,15,19,4,8,7,10,9,14,16};
TreeNode root = new TreeNode();
root.data = 11;
System.out.println("TreeMain start");
//创建二叉树
for(int item :arr) {
createTree(root,item);
} //先序遍历
System.out.println("先序遍历:");
preOrderTraverse(root); System.out.println("中序遍历");
//中序遍历
midOrderTraverse(root); System.out.println("后序遍历");
//后序遍历
postOrderTraverse(root); System.out.println("广度遍历");
//广度遍历
layOrderTraverse(root); System.out.println("深度遍历");
//深度遍历
deepOrderTraverse(root); //查找节点
find(root,10); System.out.println("树的高度:"+height(root)); System.out.println("TreeMain end");
} /**
* 根据现有数据 生成二叉树
* @param node
* @param data
*/
public static TreeNode createTree(TreeNode node,int data) {
if(null==node) {
node = new TreeNode();
node.data = data;
return node;
}else {
if(data>node.data){
node.right = createTree(node.right,data);
}else {
node.left = createTree(node.left,data); }
}
return node;
} /**
* 先序遍历
* @param node
*/
public static void preOrderTraverse(TreeNode node) {
if(null==node) {
return;
}
System.out.println(node.data+",");
preOrderTraverse(node.left);
preOrderTraverse(node.right);
} /**
* 中序遍历
* @param node
*/
public static void midOrderTraverse(TreeNode node) {
if(null==node) {
return;
}
midOrderTraverse(node.left);
System.out.println(node.data+",");
midOrderTraverse(node.right);
} /**
* 后序遍历
* @param node
*/
public static void postOrderTraverse(TreeNode node) {
if(null==node) {
return;
}
postOrderTraverse(node.left);
postOrderTraverse(node.right);
System.out.println(node.data+",");
} /**
* 广度遍历
* @param root
*/
public static void layOrderTraverse(TreeNode root) {
Queue<TreeNode> q = new ArrayDeque<>();
if(null!=root) {
System.out.println(root.data);
q.add(root.left);
q.add(root.right);
while(!q.isEmpty()) {
TreeNode node = q.poll();
System.out.println(node.data);
if(null!=node.left) {
q.add(node.left);
}
if(null!=node.right) {
q.add(node.right);
}
}
}
} /**
* 深度遍历
* @param root
*/
public static void deepOrderTraverse(TreeNode root) {
Stack<TreeNode> q = new Stack<>();
if(null!=root) {
System.out.println(root.data);
q.push(root.right);
q.push(root.left);
while(!q.isEmpty()) {
TreeNode node = q.pop();
System.out.println(node.data);
if(null!=node.right) {
q.push(node.right);
}
if(null!=node.left) {
q.push(node.left);
}
}
}
} /**
* 查找节点
* @param root 根节点
* @param data 数据
*/
public static void find(TreeNode node,int data) {
if(null==node) {
System.out.println("没有找到节点");
return ;
}
if(data>node.data){
find(node.right,data);
}else if(data<node.data){
find(node.left,data);
}else {
System.out.println("找到节点:"+data);
}
} /**
* 删除节点
* @param root 根节点
* @param data 数据
*/
public static void delete(TreeNode node,int data) {
if(null==node) {
System.out.println("没有找到节点");
return ;
}
if(data>node.data){
find(node.right,data);
}else if(data<node.data){
find(node.left,data);
}else {
System.out.println("找到节点:"+data);
if(null==node.left||null==node.right) {
//直接删除节点,
}else {
//取右子树最大的节点替换此节点,自己去实现了(哈哈)
}
}
} /**
* 求树的高度
* @param node
* @return
*/
public static int height(TreeNode node) {
if(null==node) {
return 0;
}
int hLeft = height(node.left) +1;
int hRight = height(node.right)+1;
return hLeft>hRight?hLeft:hRight;
} }
节点实体:
为了操作方便,属性都定义成public了,实际应用还是定义为private
package com.sf.test;
public class TreeNode {
//数据
public int data;
//左节点
public TreeNode left;
//右节点
public TreeNode right;
}
二叉树的相关算法还是有点复杂的,要经常温习,一段时间不用基本上就忘了,所以我用博客记录下来实现的过程,并与大家分享。
实现二叉树的基本操作(Java版)的更多相关文章
- 树的基本操作java版
看了一下树的定义,一些基本的操作,遍历,获取节点数,获取深度等等..这里参考了西电版的数据结构,基本用的都是递归实现的. 很多说明代码中都有,每个方法我都测了一下,这里我把节点类BTreeNode作为 ...
- Elasticsearch 6.4基本操作 - Java版
1. Elasticsearch Java API有四类client连接方式 TransportClient RestClient Jest Spring Data Elasticsearch 其中T ...
- 二叉树的宽度<java版>
二叉树的宽度 思路:层序遍历的时候,记录每层的节点数量,最后取记录中的最多的数量. 代码实现: public int solution(TreeNode node){ LinkedList<Tr ...
- 二叉树的深度<java版>
二叉树的结构 二叉树是比较常见的一种的一种数据结构. 首先看看二叉树的数据结构: //由左节点和右节点以及一个节点值构成 public class TreeNode{ TreeNode leftNod ...
- 《剑指offer》面试题19 二叉树的镜像 Java版
书中方法:这道题目可能拿到手没有思路,我们可以在纸上画出简单的二叉树来找到规律.最后我们发现,镜像的实质是对于二叉树的所有节点,交换其左右子节点.搞清楚获得镜像的方法,这道题实际上就变成了一道二叉树遍 ...
- 将一个二叉树左右翻转(Java 版)
public class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) { return null; ...
- 二叉树的基本操作(C语言版)
今天走进数据结构之二叉树 二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆.二叉树是链式存储结构,用的是二叉 ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- 【剑指offer】Java版代码(完整版)
原文地址:https://blog.csdn.net/baiye_xing/article/details/78428561 一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中 ...
随机推荐
- SQL Server 为存储过程添加预定设置注释代码
一个优秀的项目最少不了的是代码注释,兴许你是代码高手入目既知道该段代码主要功能是什么,但日子长了,记的东西多了,即时再熟悉的代码也渐渐的有点不认 识它,所以养成良好的写注释的习惯,对于自己对于他人都是 ...
- python(十三):网络编程之socket与socketserver
socket是操作系统中I/O系统延伸部分,支持TCP和UDP等网络通信协议,它使计算机之间(或其本身)的进程通信称为可能.socket中的socket()函数.recv()函数和send()函数,相 ...
- [Luogu4631][APIO2018] Circle selection 选圆圈
Luogu 题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1, c_2,...,c_n\) .我们尝试对这些圆运行这个算法: \(1\).找到这些圆中半径最大的.如果有多个半径最大的圆,选择 ...
- ldo的一些参数理解
psrr是衡量ldo抑制外来信号噪声的能力,而内部噪声是由基准电压和误差放大器引入的.通常器件手册说的输出噪声指的就是内部噪声. ldo的暂态响应也是一个重要指标
- Windows下安装Redis服务,修改查看密码,修改端口,常用命令
一.安装 出自:https://jingyan.baidu.com/article/0f5fb099045b056d8334ea97.html 1.要安装Redis,首先要获取安装包.Windows的 ...
- sql server2008升级
安装了试用版的sql server2008,要升级为正式企业版.仅仅须要使用安装程序的 维护-升级 功能.在升级时输入企业版序列号,就能升级为正式版.以下给两个序列号 开发版: PTTFM-X467G ...
- 2.JMeter查看结果树返回编码格式Unicode转为中文方法
在使用JMeter做接口测试时,发现相同url,用postman工具,其返回数据参数为中文,而用JMeter工具,其返回参数为Unicode,如下图所示 解决方法如下: 1.Jmeter在对应的请求上 ...
- 【备忘】windows环境下20行php代码搞定音频裁剪
先上图,由于最近的需求需要对语音文件进行处理,所以抽空研究了下php处理音/视频文件的处理,简单的demo处理,截取一个音频文件的前20秒,并保存新的媒体文件. 操作步骤: ①在此站点下载所需的辅助程 ...
- 深入理解jQuery框架-框架结构
这是本人结合资料视频总结出来的jQuery大体框架结构,如果大家都熟悉了之后,相信你们也会写出看似高档的js框架: jquery框架的总体结构 (function(w, undefined){ //定 ...
- [模拟赛]异或最大值 maxinum
此题在考试时用暴力,暴了30分. 献上30分代码: #include<stdio.h> ]; int main() { int n,t,c,i,max,j,d; freopen(" ...