实现二叉树的基本操作(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>可谓是程序猿面试的神书了,在面试中 ...
随机推荐
- PHP匹配Email、URL、IP
/* * 正则表达式匹配 */ $email = '137813369@qq.com'; $regex = '/\w+([−+.]\w+)*@\w+([−.]\w+)*\.\w+([−.]\w+)*/ ...
- Epub格式的电子书——文件组成
epub格式电子书遵循IDPF推出的OCF规范,OCF规范遵循ZIP压缩技术,即epub电子书本身就是一个ZIP文件,我们将epub格式电子书的后缀.epub修改为.zip后,可以通过解压缩软件(例如 ...
- nodejs之fs模块
nodejs中的file system文件系统模块 1.文件的读取readFile //引入文件系统模块 const fs = require('fs'); //文件读取是异步操作 fs.readFi ...
- webpack extract-text-webpack-plugin
备注: 提炼上面引用的css 1. 插件配置 const path = require("path"); const extracttextplugin = require( ...
- 使用模块化编译缩小 apk 体积
libcocos2dlua.so编译出来有11M多,其中包含了很多不需要的模块,模块化编译,把不需要用到的模块弄成0,体积就小了. 如: 修改D:\codeide\sDiShu2formm\frame ...
- 【转载】探寻C++最快的读取文件的方案
原文地址:https://www.byvoid.com/blog/fast-readfile/ 在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式.相信几乎所有的C++学习者 ...
- openresty+lua做接口调用权限限制
说明:openresty可以理解为一个服务器它将nginx的核心包含了过来,并结合lua脚本语言实现一些对性能要求高的功能,该篇文章介绍了使用openresty 1.purview.lua --调用j ...
- STL容器的resize方法
刚才写DFS程序,为了加个创建DFS树然后再次遍历的功能,把初始化的代码给封装到init()函数里,然后直接调用之后对同样是邻接表表示的DFS树进行DFS. 然后令人诧异的是竟然没有打印结果,调试发现 ...
- MSYS2环境搭建
本机环境:Windows XP 32位MSYS2地址:http://sourceforge.net/projects/msys2/ 下载32位版本,地址:http://sourceforge.net/ ...
- cookie跨域问题汇总
一.通过nginx反向代理 通过nginx反向代理后,使得浏览器认为访问的资源都是属于相同协议,域名和端口的. 详细见:<nginx实现跨域访问> 二.jsonp方式请求 v jquery ...