实现二叉树的基本操作(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>可谓是程序猿面试的神书了,在面试中 ...
随机推荐
- Sprint第一个冲刺(第三天)
一.Sprint介绍 今天我们完成了简单登录界面及美化的任务,完成了此次整个Sprint的百分之十五. 下面是实验截图: 二.Sprint周期 看板: 燃尽图:
- C#类、方法的访问修饰符
这篇文章主要介绍了C#类的访问修饰符用法,较为详细的分析了C#类的访问修饰符概念与用法,具有一定的参考借鉴价值,需要的朋友可以参考下 本文详细分析了C#类的访问修饰符用法,分享给大家供大家参考.具体用 ...
- JavaScript模块化-require.js,r.js和打包发布
在JavaScript模块化和闭包和JavaScript-Module-Pattern-In-Depth这两篇文章中,提到了模块化的基本思想,但是在实际项目中模块化和项目人员的分工,组建化开发,打包发 ...
- Eclipse git插件使用
1.Eclipse git插件使用 1)配置提交用户名和邮箱 2)在eclipse中选择Show View 搜索git 3)点击clone按钮 选择代码保存路径 4)导入项目 5)git插件功能介绍 ...
- Ubuntu : 在主机和虚拟机之间传文件
电脑用的是windows的系统,vmware player打开了一台ubuntu虚拟机,想在它们之间传送文件. 在宿主机上安装FTP文件传输软件 步骤如下: 1.Ubuntu中安装ssh,命令:sud ...
- 2、Hive UDF编程实例
Hive的UDF包括3种:UDF(User-Defined Function).UDAF(User-Defined Aggregate Function)和UDTF(User-Defined Tabl ...
- Java垃圾回收原理
无意中在网络上找到了这篇介绍垃圾回收机制的文章,好文!转一下: 垃圾回收器是如何工作的?我现在就简单的介绍一下 首先要明确几点: Java是在堆上为对象分配空间的 垃圾回收器只跟内存有关,什么IO啊, ...
- MySQL的Query Cache原理分析
QueryCache(下面简称QC)是根据SQL语句来cache的.一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用QC.每个Cache都是以SQL文本作为key来存的. 原理 ...
- hdu 1576 A/B(拓展欧几里得)
A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Java-Runoob-面向对象:Java 继承-u1
ylbtech-Java-Runoob-面向对象:Java 继承 1.返回顶部 1. Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类 ...