java 二叉树特点_二叉树的Java实现及特点总结
二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加。但是他也有自己的缺点:删除操作复杂。
我们先介绍一些关于二叉树的概念名词。
二叉树:是每个结点最多有两个子树的有序树,在使用二叉树的时候,数据并不是随便插入到节点中的,一个节点的左子节点的关键值必须小于此节点,右子节点的关键值必须大于或者是等于此节点,所以又称二叉查找树、二叉排序树、二叉搜索树。
完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
深度——二叉树的层数,就是深度。
二叉树的特点总结:
(1)树执行查找、删除、插入的时间复杂度都是O(logN)
(2)遍历二叉树的方法包括前序、中序、后序
(3)非平衡树指的是根的左右两边的子节点的数量不一致
(4) 在非空二叉树中,第i层的结点总数不超过 , i>=1;
(5)深度为h的二叉树最多有个结点(h>=1),最少有h个结点;
(6)对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
二叉树的Java代码实现
首先是树的节点的定义,下面的代码中使用的是最简单的int基本数据类型作为节点的数据,如果要使用节点带有更加复杂的数据类型,换成对应的对象即可。
/**
*
* @ClassName: com.tree.TreeNode
* @Description: 节点
* @author zhaokaiqiang
* @date 2014-12-5 下午4:43:24
*
*/
public class TreeNode {
// 左节点
private TreeNode lefTreeNode;
// 右节点
private TreeNode rightNode;
// 数据
private int value;
private boolean isDelete;
public TreeNode getLefTreeNode() {
return lefTreeNode;
}
public void setLefTreeNode(TreeNode lefTreeNode) {
this.lefTreeNode = lefTreeNode;
}
public TreeNode getRightNode() {
return rightNode;
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public boolean isDelete() {
return isDelete;
}
public void setDelete(boolean isDelete) {
this.isDelete = isDelete;
}
public TreeNode() {
super();
}
public TreeNode(int value) {
this(null, null, value, false);
}
public TreeNode(TreeNode lefTreeNode, TreeNode rightNode, int value,
boolean isDelete) {
super();
this.lefTreeNode = lefTreeNode;
this.rightNode = rightNode;
this.value = value;
this.isDelete = isDelete;
}
@Override
public String toString() {
return "TreeNode [lefTreeNode=" + lefTreeNode + ", rightNode="
+ rightNode + ", value=" + value + ", isDelete=" + isDelete
+ "]";
}
}
下面给出二叉树的代码实现。由于在二叉树中进行节点的删除非常繁琐,因此,下面的代码使用的是利用节点的isDelete字段对节点的状态进行标识
/**
*
* @ClassName: com.tree.Tree
* @Description: 二叉树的定义
* @author zhaokaiqiang
* @date 2014-12-8 上午7:51:49
*
*/
public class BinaryTree {
// 根节点
private TreeNode root;
public TreeNode getRoot() {
return root;
}
/**
* 插入操作
*
* @param value
*/
public void insert(int value) {
TreeNode newNode = new TreeNode(value);
if (root == null) {
root = newNode;
root.setLefTreeNode(null);
root.setRightNode(null);
} else {
TreeNode currentNode = root;
TreeNode parentNode;
while (true) {
parentNode = currentNode;
// 往右放
if (newNode.getValue() > currentNode.getValue()) {
currentNode = currentNode.getRightNode();
if (currentNode == null) {
parentNode.setRightNode(newNode);
return;
}
} else {
// 往左放
currentNode = currentNode.getLefTreeNode();
if (currentNode == null) {
parentNode.setLefTreeNode(newNode);
return;
}
}
}
}
}
/**
* 查找
*
* @param key
* @return
*/
public TreeNode find(int key) {
TreeNode currentNode = root;
if (currentNode != null) {
while (currentNode.getValue() != key) {
if (currentNode.getValue() > key) {
currentNode = currentNode.getLefTreeNode();
} else {
currentNode = currentNode.getRightNode();
}
if (currentNode == null) {
return null;
}
}
if (currentNode.isDelete()) {
return null;
} else {
return currentNode;
}
} else {
return null;
}
}
/**
* 中序遍历
*
* @param treeNode
*/
public void inOrder(TreeNode treeNode) {
if (treeNode != null && treeNode.isDelete() == false) {
inOrder(treeNode.getLefTreeNode());
System.out.println("--" + treeNode.getValue());
inOrder(treeNode.getRightNode());
}
}
}
在上面对二叉树的遍历操作中,使用的是中序遍历,这样遍历出来的数据是增序的。
下面是测试代码:
public class Main {
public static void main(String[] args) {
BinaryTree tree = new BinaryTree();
// 添加数据测试
tree.insert(10);
tree.insert(40);
tree.insert(20);
tree.insert(3);
tree.insert(49);
tree.insert(13);
tree.insert(123);
System.out.println("root=" + tree.getRoot().getValue());
// 排序测试
tree.inOrder(tree.getRoot());
// 查找测试
if (tree.find(10) != null) {
System.out.println("找到了");
} else {
System.out.println("没找到");
}
// 删除测试
tree.find(40).setDelete(true);
if (tree.find(40) != null) {
System.out.println("找到了");
} else {
System.out.println("没找到");
}
}
}
java 二叉树特点_二叉树的Java实现及特点总结相关推荐
- java 实现二叉排序树_详解Java二叉排序树
一.二叉排序树定义 1.二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树,或者是满足如下性 ...
- 马士兵 java 学习笔记_马士兵java教程笔记1
---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...
- java 02-cf_cf活动如何设置java环境变量_如何设置java环境变量
cf助手怎么连接wifi_连接无线网设置 对于刚刚学习java的win7用户来说,首先要学会安装jdk和配置java环境变量,这是学习java的唯一途径,否则编写的代码运行时会出现bug.关于这一点, ...
- java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...
面试题集共分为以下十部分: 一.Core Java: 1 - 95 题1 - 24 页 基础及语法: 1 - 61 题1 - 13 页 异常: 62 - 69 题13 - 15 页 集合: 70 - ...
- java console 交互_实例讲解java中Console类的用法
java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...
- java for循环_愉快地学Java语言:第五章 循环
导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇,如果 ...
- java 内存空间_怎样用java实现存储空间动态分配
1.java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象 ...
- linux java远程调试_[转]JPDA:Java平台调试架构(常用的远程调试方法)
原文出处:http://www.javaeye.com/topic/75128 最近使用WTP的Server功能很不爽,连tomcat服务器时java类中的任何改动都要重启服务器,一怒之下就改用JPD ...
- java在线编译器_什么是Java内存模型
在知识星球中,有个小伙伴提了一个问题:有一个关于JVM名词定义的问题,说"JVM内存模型",有人会说是关于JVM内存分布(堆栈,方法区等)这些介绍,也有地方说(深入理解JVM虚拟机 ...
最新文章
- CVPR2020 | PV-RCNN: 3D目标检测
- 阿里某P5程序员求助:跟女票要结婚,她家要50万彩礼,女票爸爸说钱不够可以先欠着,这婚能结吗?欠条以后能赖吗?...
- 学习dubbo(一): 简介
- 将cocos2dx项目从Visual Studio 迁移到 xcode
- python isinstance函数
- Leecode 1218. 最长定差子序列——Leecode每日一题系列
- Python编程基础01:搭建Python开发环境
- 自动化部署mysql主从复制集群_使用docker部署mysql主从复制集群
- LVS (Linux虚拟服务器)模型及算法
- linux两台电脑直连传数据,两台MAC电脑通过局域网快速传输文件
- office visio 替代_5款替代微软Visio的开源免费软件
- GitHub客户端 Desktop使用
- word VBA_替换下划线
- 人工智能——微粒群优化算法
- CDN架构原理、流量模型、网络调优
- 电路设计_示波器接地常识
- 魔兽争霸无法在这个计算机,win10系统魔兽争霸按F1无法选中自己的英雄的图文办法...
- 《写给大家看的设计书》(第四版)分享
- [推荐书籍]12本程序员必备书籍
- 流行购车平台易车买车划算吗?
热门文章
- 聊聊缓存机制:双写兜兜转转,又回到了串行化
- DevOps:从「蒸汽时代」到「高铁时代」,SUNMI DevOps转型之路 | 原力计划
- Docker 概念很难理解?一文搞定 Docker 端口绑定
- 谷歌“夜莺计划”秘密采集数百万美国人健康隐私;联发科首款7nm产能的5G芯片;2019年天猫双11落幕,最终成交额2684亿……...
- 唯品会2017年双11大促技术保障实践,全域提供25万QPS服务能力
- c#类属性和实例属性_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...
- c3p0 服务启动获取连接超时_微服务架构中的熔断、降级
- 企业微信小程序_集成微信小程序插件_地图选点插件
- (进阶篇)Redis6.2.0 集群 哨兵模式_故障转移_03
- 怎么去除idea中代码的波浪线(黄色警告线)