BST二叉搜索树节点定义:

 /**
* BST树的节点类型
* @param <T>
*/
class BSTNode<T extends Comparable<T>>{
private T data; // 数据域
private BSTNode<T> left; // 左孩子域
private BSTNode<T> right; // 右孩子域 public BSTNode(T data, BSTNode<T> left, BSTNode<T> right) {
this.data = data;
this.left = left;
this.right = right;
} public T getData() {
return data;
} public void setData(T data) {
this.data = data;
} public BSTNode<T> getLeft() {
return left;
} public void setLeft(BSTNode<T> left) {
this.left = left;
} public BSTNode<T> getRight() {
return right;
} public void setRight(BSTNode<T> right) {
this.right = right;
}
}

BST的实现:

 /**
* BST树的实现
* @param <T>
*/
class BST<T extends Comparable<T>> {
public BSTNode<T> root; // 指向根节点 /**
* BST树的初始化
*/
public BST() {
this.root = null;
}
}

BST的插入操作:

  /**
* BST树的非递归插入操作
*
* @param data
*/
public void non_insert(T data) {
// 1.判断如果root是null,如果root是null,直接生成根节点,让root指向,结束
if (root == null) {
this.root = new BSTNode<>(data, null, null);
return;
}
// 2.如果root不为空,从根节点开始搜索一个合适的位置,放新节点
BSTNode<T> cur = this.root;
BSTNode<T> parent = null; // this.root
while (cur != null) {
if (cur.getData().compareTo(data) > 0) {
parent = cur;
cur = cur.getLeft();
} else if (cur.getData().compareTo(data) < 0) {
parent = cur;
cur = cur.getRight();
} else {
return;
}
}
// 3.生成新节点,把节点的地址,写入父节点相应的地址域
if (parent.getData().compareTo(data) > 0) {
parent.setLeft(new BSTNode<T>(data, null, null));
} else {
parent.setRight(new BSTNode<T>(data, null, null));
}
}
 /**
* 递归插入
*
* @param data
*/
public void insert(T data) {
this.root= insert(data, root);
} private BSTNode<T> insert(T data, BSTNode<T> root) {
if (root == null) {
return new BSTNode<T>(data, null, null);
}
if (root.getData().compareTo(data) > 0) {
root.setLeft(insert(data,root.getLeft()));
} else if (root.getData().compareTo(data) < 0) {
root.setRight(insert(data, root.getRight()));
}else {
;
}
return root;
}

删除操作:

 /**
* 非递归实现BST树的删除操作
*
* @param data
*/
public void non_remove(T data) {
if (this.root == null) {
return;
}
// 1. 先搜索BST树,找到待删除的节点
BSTNode<T> cur = this.root;
BSTNode<T> parent = null;
while (cur != null) {
if (cur.getData().compareTo(data) > 0) {
parent = cur;
cur = cur.getLeft();
} else if (cur.getData().compareTo(data) < 0) {
parent = cur;
cur = cur.getRight();
} else {
break;
}
}
if (cur == null) {// 表示BST树中没有值为data的节点
return;
}
// 2. 判断删除节点是否有两个孩子,如果有,用前驱的值代替,直接删除前驱
if (cur.getLeft() != null && cur.getRight() != null) {
BSTNode<T> old = cur;
parent = cur;
cur = cur.getLeft();
while (cur != null) {
parent = cur;
cur = cur.getRight();
}
old.setData(cur.getData());// 前驱节点的值代替待删节点的值
}
// 3. 删除有一个孩子的节点,或者没有孩子的节点(看作有一个孩子,孩子是null)
BSTNode<T> child = cur.getLeft();
if (child == null) {
child = cur.getRight();
}
if (parent == null) {// 删除的就是根节点
this.root = child;
} else {
if (parent.getLeft() == cur) {
parent.setLeft(child);
} else {
parent.setRight(child);
}
}
}
 /**
* 递归实现删除值val的节点
*
* @param val
*/
public void remove(T val) {
this.root = remove(val, root);
}
private BSTNode<T> remove(T val, BSTNode<T> root) {
if(root==null){
return null;
}
if(root.getData().compareTo(val)>0){
root.setLeft(remove(val,root.getLeft()));
}else if(root.getData().compareTo(val)>0){
root.setRight(remove(val,root.getRight()));
}else {
if(root.getLeft()!=null&&root.getRight()!=null){
BSTNode<T> old=root;
root=root.getLeft();
while (root.getRight()!=null){
root=root.getRight();
}
old.setData(root.getData());
old.setLeft(remove(root.getData(),root.getLeft()));
}else if(root.getLeft()!=null){
return root.getLeft();
}else if(root.getRight()!=null){
return root.getRight();
}else {
return null;
}
}
return root;
}

判断有无data值:

/**
* 判断有无data值
*
* @param data
* @return
*/
public boolean non_query(T data) {
BSTNode<T> cur = root;
if (root == null) {
return false;
}
while (cur != null) {
if (cur.getData().compareTo(data) > 0) {
cur = cur.getLeft();
} else if (cur.getData().compareTo(data) < 0) {
cur = cur.getRight();
} else {
return true;
}
}
return false;
}
  /**
* 递归实现判断有无data
* @param data
* @return
*/
public boolean query(T data){
return query(data,root);
} private boolean query(T data, BSTNode<T> root) {
if(root==null){
return false;
}
if(root.getData().compareTo(data)>0){
return query(data,root.getLeft());
}
if(root.getData().compareTo(data)<0){
return query(data,root.getRight());
}
else {
return true;
}
}

前序遍历:

 /**
* 前序遍历BST树
*/
public void preOrder() {
System.out.print("前序遍历");
preOrder(this.root);
} private void preOrder(BSTNode<T> root) {
if (root != null) {
System.out.print(root.getData() + " ");
preOrder(root.getLeft());
preOrder(root.getRight());
}
}

中序遍历:

 /**
* 中序遍历
*/
public void inOrder() {
System.out.println();
System.out.print("中序遍历");
inOrder(this.root);
System.out.println();
} private void inOrder(BSTNode<T> root) {
if (root != null) {
inOrder(root.getLeft());
System.out.print(root.getData() + " ");
inOrder(root.getRight());
}
}

后序遍历:

/**
* 后序遍历
*/
public void postOrder() {
System.out.println("后序遍历");
postOrder(this.root);
System.out.println();
} private void postOrder(BSTNode<T> root) {
if (root != null) {
postOrder(root.getLeft());
postOrder(root.getRight());
System.out.print(root.getData() + " ");
}
}

层序遍历:

/**
* BST的层序遍历
*/
public void levelOrder() {
System.out.println("递归层序遍历");
for (int i = 0; i < this.level(); i++) {
levelOrder(this.root, i);
}
} /**
* 层序遍历的递归实现
*
* @param root
* @param i
*/
private void levelOrder(BSTNode<T> root, int i) {
if (root != null) {
if (i == 0) {
System.out.print(root.getData() + " ");
return;
}
levelOrder(root.getLeft(), i - 1);
levelOrder(root.getRight(), i - 1);
}
}

返回BST节点的个数:

 /**
* 返回BST树的所有节点个数的API
*
* @return
*/
public int number() {
return number(root);
} /**
* 以root为根节点计算BST树的节点个数
*
* @param root
* @return
*/
private int number(BSTNode<T> root) {
if (root == null) {
return 0;
} else {
return number(root.getLeft()) + number(root.getRight()) + 1;
}
}

返回BST的高度:

  /**
* 返回BST树的高度的API
*
* @return
*/
public int level() {
return level(this.root);
} private int level(BSTNode<T> root) {
if (root == null) {
return 0;
} else {
int left = level(root.getLeft());
int right = level(root.getRight());
return left > right ? left + 1 : right + 1;
}
}

BST的镜像反转:

 /**
* 求BST树的镜像翻转API
*/
public void mirror() {
mirror(this.root);
} /**
* 求BST镜像翻转的递归实现
*
* @param root
*/
private void mirror(BSTNode<T> root) {
if (root == null) {
return;
}
BSTNode<T> tmp = root.getLeft();
root.setLeft(root.getRight());
root.setRight(tmp); mirror(root.getLeft());
mirror(root.getRight());
}

返回BST树第K小的元素:

/**
* 返回中序遍历倒数第k个节点的值
*
* @param k
* @return
*/
public T getOrderValue(int k){
getOrderValue(this.root, k);
return cur;
}
private int i=0;
private T getOrderValue(BSTNode<T> root, int k) {
if(root == null){
return null;
} T val = getOrderValue(root.getLeft(), k);
if(val != null){
return val;
} if(i++ == k)
{
return root.getData();
} return getOrderValue(root.getRight(), k);
}

根据前序和中序数组,重建搜索二叉树:

/**
* 根据参数传入的pre和in数组,重建二叉树
* @param pre
* @param in
*/
public void rebuild(T[]pre,T[]in){
this.root=rebuild(pre,0,pre.length-1,in,0,in.length-1);
} private BSTNode<T> rebuild(T[] pre, int i, int j, T[] in, int m, int n) {
if(i>j||m>n){
return null;
}
BSTNode<T> node=new BSTNode<T>(pre[i],null,null);
for (int k=m;k<=n;k++){
if(pre[i].compareTo(in[k])==0){
node.setLeft(rebuild(pre,i+1,i+k-m,
in,m,k-1));
node.setRight(rebuild(pre,i+(k-m)+1,j,
in,k+1,n));
break;
}
}
return node;
}

Java 二叉树遍历相关操作的更多相关文章

  1. 二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

    将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: typedef struct TreeNode{ int data; struct TreeNode *le ...

  2. java文件夹相关操作 演示样例代码

    java文件夹相关操作 演示样例代码 package org.rui.io; import java.io.File; import java.io.FilenameFilter; import ja ...

  3. java 二叉树遍历

    package com.lever; import java.util.LinkedList;import java.util.Queue; /** * 二叉树遍历 * @author lckxxy ...

  4. java实现二叉树的相关操作

    import java.util.ArrayDeque; import java.util.Queue; public class CreateTree { /** * @param args */ ...

  5. java 发送邮件 email相关操作代码测试,生成复杂格式邮件,发送邮件相关操作

    项目源码下载:http://download.csdn.net/detail/liangrui1988/6720047 效果图: 相关代码: test1 package com.mail; impor ...

  6. java虚拟机栈 相关操作

    针对JVM虚拟栈 和栈帧的操作 虚拟机栈: 栈元素是栈帧.方法调用,栈帧入栈,反之出栈. 栈帧:一个方法的运行空间. 1.局部变量表:方法定义的局部变量.方法的参数存在该表. 实例方法中有个隐含参数“ ...

  7. Java 二叉树遍历右视图-LeetCode199

    题目如下: 题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样. 换成通俗的意思:按层遍历二叉树,输出每层的最右端结点. 这就明白时一道二叉树层序遍历的问题,用一个队 ...

  8. java二叉树遍历——深度优先(DFS)与广度优先(BFS) 递归版与非递归版

    介绍 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止. 广度优先遍历:从根节点出发,在横向遍历二叉 ...

  9. Java中JSONObject相关操作

    maven项目pom配置: <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>js ...

随机推荐

  1. 为IIS服务器配置SSL,并设置为默认使用https协议访问网站

    要使网站支持https协议,需要SSL证书,我的服务器和域名都是在阿里云购买的,所以这里我演示阿里云获取SSL证书的方法 我先说下我的服务器环境:windows server 2012 + IIS8. ...

  2. Spark Core 1.3.1源码解析及个人总结

    本篇源码基于赵星对Spark 1.3.1解析进行整理.话说,我不认为我这下文源码的排版很好,不能适应的还是看总结吧. 虽然1.3.1有点老了,但对于standalone模式下的Master.Worke ...

  3. Centos6.6安装JDK1.8

    首先从官网下载jdk1.8,地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...

  4. python os模块用法

    import os   #os主要做路径管理import glob  #glob主要做搜索查询匹配import sys inputpath = r"C:\Users\Administrato ...

  5. 初试avalon

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. springboot输出hello world,3种方式(String,JSON,jsp),IDEA开发工具

    新建项目: File -> new -> Project -> Spring Initializr -> Next -> Next -> Next-> Pro ...

  7. 关于if else 和 三目运算符的效率问题-java

    1.从类型转换上看,因为三目运算符在做判断的时候需要考虑到类型转换的问题,而if else 不需要考虑类型转换. 所以 if else 效率高一点. 2.从总体上看 A:需要考虑到循环自身所占用的时间 ...

  8. Oracle删除修改字段

    Oracle 增加修改删除字段 添加字段的语法:alter table tablename add (column datatype [default value][null/not null],…. ...

  9. [Catalan数三连]网格&有趣的数列&树屋阶梯

    如何让孩子爱上打表 Catalan数 Catalan数是组合数学中一个常出现在各种计数问题中的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名. 先丢个公式(设第n项为$ ...

  10. STM32时钟初始化函数SystemInit()详解【转】

    花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出): 使用的是3.5的库,用的是STM32F107VC,开发环境RVM ...