树是一类重要的非线性结构。而二叉树是一种比较重要的树,接下来我们来了解二叉树的相关内容。

二叉搜索树:每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大。

/**
* 二叉搜索树 O(n)
*
* @author jade
*
*/
public class BinarySearchTree { private int count;
private Node root; public int size() {
return count;
} public boolean isEmpty() {
return count == 0;
} /**
* 插入元素
*
* @param key
* @param value
*/
public void insert(int key, Object value) {
root = insert(root, key, value);
} private Node insert(Node node, int key, Object value) {
if (node == null) {
count++;
return new Node(key, value);
}
if (key == node.key) {
node.value = value;
} else if (key < node.key) {
node.left = insert(node.left, key, value);
} else {
node.right = insert(node.right, key, value);
}
return node;
} public boolean contain(int key) {
return contain(root, key);
} private boolean contain(Node node, int key) {
if (node == null) {
return false;
}
if (key == node.key) {
return true;
} else if (key < node.key) {
return contain(node.left, key);
} else {
return contain(node.right, key);
}
} public Node search(int key) {
return search(root, key);
} private Node search(Node node, int key) {
if (node == null) {
return null;
}
if (key == node.key) {
return node;
} else if (key < node.key) {
return search(node.left, key);
} else {
return search(node.right, key);
}
} /**
* 前序遍历
*/
public void preOrder() {
preOrder(root);
} private void preOrder(Node node) {
if (node != null) {
System.out.println(node.key);
preOrder(node.left);
preOrder(node.left);
}
} /**
* 中序遍历
*/
public void inOrder() {
inOrder(root);
} private void inOrder(Node node) {
if (node != null) {
inOrder(node.left);
System.out.println(node.key);
inOrder(node.right);
}
} /**
* 后续遍历
*/
public void postOrder() {
postOrder(root);
} private void postOrder(Node node) {
if (node != null) {
postOrder(node.left);
postOrder(node.right);
System.out.println(node.key);
}
} /**
* 层序遍历(广度优先遍历)
*/
public void levelOrder() {
ConcurrentLinkedQueue<Node> queue = new ConcurrentLinkedQueue<Node>();
queue.add(root);
while (!queue.isEmpty()) {
Node node = queue.peek();
System.out.println(node.key);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
} /**
* key最小值的节点
*
* @return
*/
public Node getMin() {
if (root == null) {
return null;
}
return minNode(root);
} private Node minNode(Node node) {
if (node.left == null) {
return node;
}
return minNode(node.left);
} /**
* key最大值的节点
*
* @return
*/
public Node getMax() {
if (root == null) {
return null;
}
return getMax(root);
} private Node getMax(Node node) {
if (node.right == null)
return node;
return getMax(node.right);
} /**
* 删除最小值节点
*/
public void removeMin() {
if (root != null) {
root = removeMin(root);
}
} private Node removeMin(Node node) {
if (node.left == null) {
Node rightNode = node.right;
count--;
return rightNode;
}
node.left = removeMin(node.left);
return node;
} /**
* 删除最大值所在节点
*/
public void removeMax() {
if (root != null) {
root = removeMax(root);
}
} private Node removeMax(Node node) {
if (node.right == null) {
Node leftNode = node.left;
count--;
return leftNode;
}
node.right = removeMax(node.right);
return node;
} class Node {
int key;
Object value;
Node left;
Node right; public Node(int key, Object value) {
this.key = key;
this.value = value;
}
}
}

java算法02 - 树的更多相关文章

  1. java算法实现树型目录反向生成(在指定的盘符或位置生成相应的文件结构)

    http://www.cnblogs.com/interdrp/p/6702482.html 由于此次文件管理系统的升级确实给我们带来了很多方便且在性能上有很大提升,经过这段时间的使用 也发现了些问题 ...

  2. 数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树

    某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较为简单,容易教学.在这里,我们区分开左倾红黑树和普通红黑树. 红黑树 ...

  3. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  4. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  5. Java学习02

    Java学习02 1.导入内部的包 一.在包的下面加入下面一句话: import    java.util.Scanner; 二.在类中 Scanner input=new     Sanner(Sy ...

  6. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  7. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  8. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  9. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

随机推荐

  1. C语言--第1次作业2.0版

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 经过一周C语言的正式课堂学习,不同于暑期时扒视频囫囵吞枣式学习,林丽老师的讲解详细异常,尽管已经学习了一部分内 ...

  2. HTML5外包团队 更新一下2019最新案例

    本项目控件均为动态加载,3D部分使用Unity3D,其它基于ReactJS,NodeJS,部分使用cocos2D,由于项目涉密,只能发部分截图,欢迎联系索取更多案例,企鹅号 372900288 祝大家 ...

  3. (一)为什么要UML

    1 建模的意义 模型是对于现实的简化,建模是为了更好的理解系统 模型帮助我们按照实际情况或需求对系统可视化 模型允许我们详细说明系统的构造,行为 模型给出一个构造系统的模板 模型对我们做出的决策进行文 ...

  4. 闽南师范大学·大英A3复习专题

    精读<新视野·读写教程A3> U2: words: TEXT A   TEXT B appraise vt.评定 | abort vt.(因困难或危险)使(活动)终止 paralyze v ...

  5. mysq带条件的分页查询数据结果错误

    记一次mysql分页条件查询的结果出错: 以一张用户表为例,首先我们看表中的所有数据,注意红色框住的部分: 我们使用不带条件的分页查询来查询,数据显示是OK的: SELECT id,login_nam ...

  6. CDH5.16.1集群新增节点

    如果是全新安装集群的话,可以参考<Ubuntu 16.04上搭建CDH5.16.1集群> 下面是集群新增节点步骤: 1.已经存在一个集群,有两个节点 192.168.100.19 hado ...

  7. xls文件导入数据库

     protected void btn_ok_Click(object sender, EventArgs e)     {         int num = 0;                  ...

  8. 雷林鹏分享:jQuery EasyUI 数据网格 - 添加复选框

    jQuery EasyUI 数据网格 - 添加复选框 本实例演示如何放置一个复选框列到数据网格(DataGrid).通过复选框,用户将可以选择 选中/取消选中 网格行数据. 为了添加一个复选框列,我们 ...

  9. Git笔记整理

    git 分支:   &.创建分支      创建分支很简单:git branch <分支名>       &.切换分支      git checkout <分支名& ...

  10. office-excel

    Excel打印每张纸都带表头 页面布局--->打印标题--->顶端标题行