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

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

/**
* 二叉搜索树 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. 16_Linux网络配置

    A类:255.0.0.0        8 0 000 0001 - 0 111 1111 127用户回环,1-126 2^7-1个A类地址 容纳多少个主机:2^24-2 主机位全0:网络地址 主机位 ...

  2. HTTP响应 状态码描述

  3. React子组件和父组件通信

    React子组件和父组件通信包括以下几个方面: 子组件获取父组件属性:props或者state 子组件调用父组件的方法 父组件获取子组件的属性:props或者state 父组件调用子组件的方法 我们从 ...

  4. 小程序 新建项目底部tabbar

    在app.json中配置 { "pages": [ "pages/index/index", "pages/staging/staging" ...

  5. day2作业

    购物车(两个程序)用户入口1商品信息存在文件里2已购商品,余额记录商家入口2可以添加商品,修改商品价格

  6. Shell 脚本练习

    [第一个] #!/bin/bash#每个用户的总充值和消费以及剩余. cat yuanbao.txt |grep -v 2016 |awk '{print $3}' |awk '!a[$0]++' & ...

  7. vue-cli脚手架build目录中的webpack.prod.conf.js配置文件

    // 下面是引入nodejs的路径模块 var path = require('path') // 下面是utils工具配置文件,主要用来处理css类文件的loader var utils = req ...

  8. npm run build 打包后,如何运行在本地查看效果(Nginx服务)

    这段时间,研究了一下vue 打包的很慢的问题.但是当我 npm run build 打包后,在本地查看效果的时候,活生生被我老大鄙视了,因为我打开了XAMPP.他说:你怎么不用Nginx啊?用这个一堆 ...

  9. Docker私有仓库实例

    C:\Users\think\.m2\settings.xml文件配置: <?xml version="1.0" encoding="UTF-8"?> ...

  10. 启动Cognos时报0106错误

    1. 问题描述 启动Cognos失败,报错代码为0106. 2. 问题分析 是jdk版本不兼容. 3. 解决方案 方案一:更换jdk1.6,可以使用免安装版,不需要卸载原有的jdk将java_home ...