用Java实现一个二叉树
介绍
使用Java实现一个int值类型的排序二叉树
二叉树
二叉树是一个递归的数据结构,每个节点最多有两个子节点。
通常二叉树是二分查找树,每个节点它的值大于或者等于在它左子树节点上的值,小于或者等于在它右子树节点上的值,如下图
为了实现二叉树,我们使用一个Node类来表示节点,节点存储int类型的值,还有对子节点的引用。
package com.java.node.BinaryTree;
public class Node {
int data;
Node left;
Node right;
public Node(int data) {
this.data = data;
this.left = null;
this.right = null;
}
}
然后添加树的root节点
package com.java.node.BinaryTree;
public class BinaryTree {
Node root;
}
通常的操作
添加节点
首先我们必须找到新节点的位置,是为了保持树排序。我们必须从root节点开始,必须遵循下面的规则:
- 如果新节点小于当前的值,我们将会进入左子树
- 如果新节点大于当前的节点。我们将会进入右子树
- 当当前的节点是null时,我们已经到达叶子节点,我们可以添加新节点到这个位置。
我们将会创建递归方法做添加节点操作
private Node addNode(Node current, int value) {
if (current == null) {
return new Node(value);
}
if (value < current.data) {
current.left = addNode(current.left, value);
} else if (value > current.data) {
current.right = addNode(current.right, value);
} else {
return current;
}
return current;
}
public void addNode(int value) {
root = addNode(root, value);
}
可以使用方法创建一个二叉树了
public BinaryTree createBinaryTree() {
BinaryTree bt = new BinaryTree();
bt.addNode(6);
bt.addNode(4);
bt.addNode(8);
bt.addNode(10);
return bt;
}
查找一个节点
private boolean containNode(Node current, int value) {
if (current == null) {
return false;
}
if (value == current.data) {
return true;
}
return value < current.data ? containNode(current.left, value) : containNode(current.right, value);
}
public boolean containNode(int value) {
return containNode(root, value);
}
删除一个节点
private Node deleteNode(Node current, int value) {
if (current == null) {
return null;
}
if (value == current.data) {
if (current.left == null && current.right == null) {
return null;
}
if (current.left == null) {
return current.right;
}
if (current.right == null) {
return current.left;
}
int smallestValue = findSmallestValue(current.right);
current.data = smallestValue;
current.right = deleteNode(current.right, smallestValue);
return current;
}
if (value < current.data) {
current.left = deleteNode(current.left, value);
return current;
}
current.right = deleteNode(current.right, value);
return current;
}
private int findSmallestValue(Node root) {
return root.left == null ? root.data : findSmallestValue(root.right);
}
遍历树
我们将以不同的方式遍历树,以depth-first,breadth-first方式遍历树。
以Depth-First遍历树
Depth-first查询是一种在查询兄弟节点之前,尽可能的查询每个子节点。
in-order,pre-order,post-order方式都是以depth-first方式遍历树的。
in-order遍历是首先遍历左子树,然后root节点,最后是右子树。
public void traverseInOrder(Node root) {
if (root != null) {
traverseInOrder(root.left);
System.out.println(root.data);
traverseInOrder(root.right);
}
}
pre-order遍历首先是root节点,然后是左子树,最后是右子树。
public void traversePreOrder(Node root) {
if (root != null) {
System.out.println(root.data);
traversePreOrder(root.left);
traversePreOrder(root.right);
}
}
post-order遍历首先是遍历左子树,然后是右子树,最后是root节点。
public void traversePostOrder(Node root) {
if (root != null) {
traversePostOrder(root.left);
traversePostOrder(root.right);
System.out.println(root.data);
}
}
以Breadth-First遍历
它在遍历下一级的节点之前,会遍历当前级的所有节点。
这种类型的遍历也叫做level-order,遍历树从root节点开始,从左到右。
为了实现,使用队列来存储每个级别的节点。我们将会从列表中获取每个节点。然后添加他的子节点到队列中。
public void traverseLevelOrder(Node root) {
if (root == null) {
return;
}
Queue<Node> nodes = new LinkedList<Node>();
nodes.add(root);
while(!nodes.isEmpty()) {
Node node = nodes.remove();
System.out.println(node.data);
if (node.left != null) {
nodes.add(node.left);
}
if (node.right != null) {
nodes.add(node.right);
}
}
}
用Java实现一个二叉树的更多相关文章
- 利用Java实现表达式二叉树
(*^-^*) 什么是二叉树,这里不再介绍,可以自行百度:二叉树.在这里利用java实现“表达式二叉树”. 表达式二叉树的定义 第一步先要搞懂表达式二叉树是个什么东东?举个栗子,表达式:(a+b×(c ...
- LeetCode 606. Construct String from Binary Tree (建立一个二叉树的string)
You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...
- Java实现求二叉树的路径和
题: 解: 这道题考的是如何找出一个二叉树里所有的序列. 我的思路是先从根节点开始遍历,找出所有的子节点,因为每个子节点只有一个父节点,再根据每个子节点向上遍历找出所有的序列,再判断序列的总和. 这样 ...
- Java实现查找二叉树&C++的做法
写了个Java的查找二叉树,用递归做的,不用递归的还没弄出来.先贴一下.回头再研究. BTreeTest.java: public class BTreeTest{ class Node{ Node ...
- java学习之—二叉树
package com.data.java.towtree; import java.io.IOException; /** * 二叉树 * @Title: uminton */ class Node ...
- JAVA数据结构之二叉树
用树作为存储数据的结构兼具像数组一样查询速度快和像链表一样具有很快的插入和删除数据项的优点 我们用圆点表示节点,连接圆的直线表示边如下图所示就表示了一颗树,接下来我们讨论的二叉树即每个节点最多只有两个 ...
- paip.操作符重载的缺失 Java 的一个大缺点
paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如 java代码会直接移植到 ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- java 多线程——一个定时调度的例子
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
随机推荐
- [Eclipse的Maven项目搭建,仅为测试Maven功能]如何在Eclipse下搭建Maven项目
[Eclipse的Maven项目搭建,仅为测试Maven功能]如何在Eclipse下搭建Maven项目 你可能需要了解以下才能更好的阅读以下: 在 Windows 中配置Maven: http:/ ...
- Java学习笔记【十二、网络编程】
原计划的学习结束时间是3月4日,目前看来已经延迟了,距离低标还差一些,多方面原因,也不找借口,利用周末赶赶进度,争取本周末把低标完成吧! 参考: http://www.runoob.com/java/ ...
- 第三篇.python编辑器和集成环境01
修改python的镜像源 使用pip可以提高网速 \Lib\site-packages\pip\models\index.py文件,将PYPI的值改为你所需要的镜像源即可,例如改为豆瓣镜像源: #Py ...
- Use pkgsrc on ARM
What is this page? This page describes how to use pkgsrc on ARM architecture with EABI support. I bo ...
- -sh: ./a.out: not found
感觉程序没有问题,编译生成a.out后,拷贝到开发板执行,提示 -sh: ./a.out: not found. 上网查找问题,大概原因有2个 一就是有可能/lib下面没有C库 就是没有glibc或者 ...
- 【转】vm ubuntu14.04 建立共享文件夹
第一步:启动Ubuntu 14.04(其他版本的Ubuntu操作差不多) 1. 在VMware虚拟机界面,点VM->Install VMware Tools.之后,显示如下图: ...
- 排序算法之快速排序QuickSort
挖坑填数-快速排序 1. left = L,right = R;将基准数挖出形成第一个坑s[left]; 2. right --; 由后向前找比它小的数,找到后挖出此数填前一个坑s[left]中. 3 ...
- NTP服务及时间同步
环境: centos7 server 192.168.2.171 client 192.168.2.173.192.168.2.174 整体思路:173.174同步171的时间,171定时同 ...
- Spring下的@Order和@Primary与javax.annotation-api下@Priority【Spring4.1后】等方法控制多实现的依赖注入(转)
@Order 可以作用在类.方法.属性. 影响加载顺序. 若不加,spring的加载顺序是随机的. @Primary 当注入bean冲突时,以@Primary定义的为准. @Order是控制配置类的加 ...
- RAID的多种实现
RAID的诞生 由加利福尼亚大学伯克利分校(University of California-Berkeley)在1988年,发表的文章:"A Case for Redundant Arra ...