实现二叉树的基本操作(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>可谓是程序猿面试的神书了,在面试中 ...
随机推荐
- MySQL中的表中增加删除字段
1.增加一个字段alter table user表 add COLUMN new1字段 VARCHAR(20) NOT NULL DEFAULT 0; //增加一个字段,VARCHERA 20 , ...
- 《DSP using MATLAB》示例Example 6.9
代码: % All-Pole IIR filter to Lattice structure filter a = [1, 13/24, 5/8, 1/3]; K = dir2latc(a) % To ...
- 以gevent(协程) 方式跑uwsgi服务
当你的系统存在一些IO或网络请求较久的操作时, 如果以默认的方式启动uwsgi服务, 那么如果这类请求过多的时候, 所以进程被卡死. uwsgi就无法再对后续请求做处理了. 这时可以用gevent的方 ...
- 5.JMeter测试mysql数据库
1.使用jmeter测试mysql数据库时,需要导入jar包,jar包网盘地址为:链接: https://pan.baidu.com/s/1-5-s7HccudT4GirpmBVn6Q 密码: bea ...
- c# 数据库通用类DbUtility
DbProviderType数据库类型枚举 /// <summary> /// 数据库类型枚举 /// </summary> public enum DbProviderTyp ...
- 记一次socket_create()函数耗时异常记录
背景: 下午开发时突然整个页面耗时增加,空接口每次都需要2-3秒的耗时,一开始以为连开发环境数据库出现问题,最后断开数据库跑,发现还是很慢 最终逐步调试此页面耗时,定位到了socket_create( ...
- jeecg中树形显示的用法
1.GoodsController中显示的方法如下: @RequestMapping(params = "goodsgrid") @ResponseBody public Obje ...
- Windows 键盘快捷键概述
在 Windows 中工作时,利用快捷键代替鼠标.可以利用键盘快捷键打开.关闭和导航“开始”菜单.桌面.菜单.对话框以及网页.键盘还可以让您更简单地与计算机交互. 单击一个标题或按 TAB 键可以突 ...
- 如何安装nginx第三方模块
nginx文件非常小但是性能非常的高效,这方面完胜apache,nginx文件小的一个原因之一是nginx自带的功能相对较少,好在nginx允许第三方模块,第三方模块使得nginx越发的强大. 在安装 ...
- Vue.js: temple
ylbtech-Vue.js: temple 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返 ...