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

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

/**
* 二叉搜索树 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. EF的优缺点

    优点: 1.简洁的Linq to Sql语句大大提高了开发人员的效率,不要再写复杂的sql语句: 2.不再需要再管应用程序如何去连接数据库: 3.EF可以用作用于数据服务和OData Service的 ...

  2. shell脚本while read line的使用

    #### 题目要求计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字.例如a.txt内容如下:12aa*lkjskdjalskdflkskdjflkjj我们脚本名字为 ...

  3. NetSec2019 20165327 Exp6 信息搜集与漏洞扫描

    NetSec2019 20165327 Exp6 信息搜集与漏洞扫描 一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容 1.各种搜索技巧的应用 2.DNS IP注册信息的查询 ...

  4. gm图片处理器:The gm/convert binaries can't be found

    今天在使用node处理模块gm的时候,总是无法正常使用,报:The gm/convert binaries can't be found(找不到gm/convert二进制文件) google了一下,发 ...

  5. 【洛谷p1162】填涂颜色

    (今天yy出奇的不活泼,认真的吓人) [传送门] 算法标签: 思路啊qwq: part1: 想法是先暴搜出每一行的1,取最前方一个1和最后方一个1,然后中间的0填上色,80分,因为没有考虑到“0001 ...

  6. word中一页中添加两种不同的页码

    ,在文档编写的过程中,可能一个页面需要编写两个不同的页码,举个例子,在页脚有一个页码是整个文档的页码,页眉有一个页码,是每个章节的页码: 设置如下: 此处选中这个图标是为了能够看到分节符和其他的符号 ...

  7. HDFS的上传与下载(put & get)

    最近在做一个小任务,将一个CDH平台中Hive的部分数据同步到另一个平台中.毕竟我也刚开始工作,在正式开始做之前,首先进行了一段时间的练习,下面的内容就是练习时写的文档中的内容.如果哪里有错误或者疏漏 ...

  8. vue-cli(vue脚手架) 简单使用

    1.vue-cli 作用 vue-cli作为vue的脚手架,可以帮助我们在实际开发中自动生成vue.js的模板工程. 2.vue-cli 使用 a. 安装全局vue-cli npm install v ...

  9. springBoot 随笔(二)

    此文为springBoot 结合 thymeleaf ,解析后台接口数据展示到html页面 基于 springBoot(一)工程. 1/ 引用 thymeleaf 组件依赖 <!-- depen ...

  10. vue实现动态异步组件

    https://segmentfault.com/a/1190000015080442 https://www.jianshu.com/p/40a364b5e964 <component :is ...