1、首先,须要一个节点对象的类。这些对象包括数据。数据代表存储的内容,并且还有指向节点的两个子节点的引用

class Node {
public int iData;
public double dData;
public Node leftChild;
public Node rightChild;
public void displayNode() {
System.out.print("{");
System.out.print(iData);
System.out.print(",");
System.out.print(dData);
System.out.print("}");
}
}

2、插入一个节点

从根開始查找一个对应的节点,它将是新节点的父节点。

当父节点找到了,新节点就能够连接到它的左子节点或右子节点处。这取决于新节点的值是比父节点的值大还是小。

以下是insert()方法代码:

public void insert(int id, double dd) {
Node newNode = new Node();
newNode.iData = id;
newNode.dData = dd;
if(root == null)
root = newNode;
else {
Node current = root;
Node parent;
while(true) {
parent = current;
if(id < current.iData) {
current = current.leftChild;
if(current == null) {
parent.leftChild = newNode;
return;
}
} else {
current = current.rightChild;
if(current == null) {
parent.rightChild = newNode;
return;
}
}
} // end while
} // end else
}

这里用一个新的变量parent(current的父节点),来存储遇到的最后一个不是null的节点。必须这样做,由于current在查找的过程中会变成null,才干发现它查过的上一个节点没有一个相应的子节点。

假设不存储parent。就会失去插入新节点的位置。

3、查找一个节点

public Node find(int key) {
// 如果树非空
Node current = root;
while(current.iData != key) {
if(key < current.iData)
current = current.leftChild;
else
current = current.rightChild;
if(current == null)
return null;
}
return current;
}

找到节点:假设while循环不满足条件,从循环的末端退出来。current的iData字段和key相等,这就找到了该节点。

找不到节点:假设current等于null。在查找序列中找不到下一个子节点,到达序列的末端而没有找到要找的节点。表明了它不存在。返回nulll来指出这个情况。

4、遍历树(前序遍历。中序遍历,后序遍历)

/**
* 前序遍历
* @param localRoot
*/
public void preOrder(Node localRoot) {
if(localRoot != null) {
System.out.print(localRoot.iData+" ");
preOrder(localRoot.leftChild);
preOrder(localRoot.rightChild);
}
} /**
* 中序遍历
* @param localRoot
*/
public void inOrder(Node localRoot) {
if(localRoot != null) {
preOrder(localRoot.leftChild);
System.out.print(localRoot.iData+" ");
preOrder(localRoot.rightChild);
}
} /**
* 后序遍历
* @param localRoot
*/
public void postOrder(Node localRoot) {
if(localRoot != null) {
preOrder(localRoot.leftChild);
preOrder(localRoot.rightChild);
System.out.print(localRoot.iData+" ");
}
}

遍历树的最简单方法使用递归的方法。

用递归的方法遍历整棵树要用一个节点作为參数。初始化这个节点是根。比如中序遍历仅仅须要做三件事:

1)、调用自身来遍历节点的左子树

2)、訪问这个节点

3)、调用自身来遍历节点的右子树。

5、查找最大值和最小值

/**
* 求树中的最小值
* @return
*/
public Node minimum() {
Node current;
current = root;
Node last = null;
while(current != null) {
last = current;
current = current.leftChild;
}
return last;
} /**
* 求树中的最大值
* @return
*/
public Node maxmum() {
Node current;
current = root;
Node last = null;
while(current != null) {
last = current;
current = current.rightChild;
}
return last;
}

下面是完整測试代码:

package binTree;

class Node {
public int iData;
public double dData;
public Node leftChild;
public Node rightChild;
public void displayNode() {
System.out.print("{");
System.out.print(iData);
System.out.print(",");
System.out.print(dData);
System.out.print("}");
}
} class Tree {
private Node root;
public Tree() {
root = null;
}
/**
* 查找节点
* @param key
* @return
*/
public Node find(int key) {
// 如果树非空
Node current = root;
while(current.iData != key) {
if(key < current.iData)
current = current.leftChild;
else
current = current.rightChild;
if(current == null)
return null;
}
return current;
}
/**
* 插入节点
* @param id
* @param dd
*/
public void insert(int id, double dd) {
Node newNode = new Node();
newNode.iData = id;
newNode.dData = dd;
if(root == null)
root = newNode;
else {
Node current = root;
Node parent;
while(true) {
parent = current;
if(id < current.iData) {
current = current.leftChild;
if(current == null) {
parent.leftChild = newNode;
return;
}
} else {
current = current.rightChild;
if(current == null) {
parent.rightChild = newNode;
return;
}
}
} // end while
} // end else
}
/**
* 前序遍历
* @param localRoot
*/
public void preOrder(Node localRoot) {
if(localRoot != null) {
System.out.print(localRoot.iData+" ");
preOrder(localRoot.leftChild);
preOrder(localRoot.rightChild);
}
} /**
* 中序遍历
* @param localRoot
*/
public void inOrder(Node localRoot) {
if(localRoot != null) {
preOrder(localRoot.leftChild);
System.out.print(localRoot.iData+" ");
preOrder(localRoot.rightChild);
}
} /**
* 后序遍历
* @param localRoot
*/
public void postOrder(Node localRoot) {
if(localRoot != null) {
preOrder(localRoot.leftChild);
preOrder(localRoot.rightChild);
System.out.print(localRoot.iData+" ");
}
} /**
* 求树中的最小值
* @return
*/
public Node minimum() {
Node current;
current = root;
Node last = null;
while(current != null) {
last = current;
current = current.leftChild;
}
return last;
} /**
* 求树中的最大值
* @return
*/
public Node maxmum() {
Node current;
current = root;
Node last = null;
while(current != null) {
last = current;
current = current.rightChild;
}
return last;
}
} public class TreeApp {
public static void main(String[] args) {
Tree theTree = new Tree();
/**
* 50
* / \
* 25 75
* / \ \
* 12 37 87
* / \ \
* 30 43 93
* \ \
* 33 97
*/
theTree.insert(50, 1.5);
theTree.insert(25, 1.2);
theTree.insert(75, 1.7);
theTree.insert(12, 1.5);
theTree.insert(37, 1.2);
theTree.insert(43, 1.7);
theTree.insert(30, 1.5);
theTree.insert(33, 1.2);
theTree.insert(87, 1.7);
theTree.insert(93, 1.5);
theTree.insert(97, 1.5);
System.out.println("插入完成~"); //找到root节点
Node nodeRoot = theTree.find(50);
// 中序遍历
theTree.inOrder(nodeRoot);
System.out.println();
// 求最小值
System.out.println("mini:"+ theTree.minimum().iData);
// 求最大值
System.out.println("max:"+ theTree.maxmum().iData); }
}

Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作的更多相关文章

  1. Java实现二叉搜索树的插入、删除

    前置知识 二叉树的结构 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode( ...

  2. Java实现二叉搜索树

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11406176.html 尝试一下用Java实现二叉搜索树/二叉查找树,记录自己的学习历程. 1 ...

  3. 【Java】 剑指offer(33) 二叉搜索树的后序遍历序列

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如 ...

  4. 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

    问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路: 1.首先后序遍历的结果是[(左子 ...

  5. 剑指Offer-23.二叉搜索树的后序遍历序列(C++/Java)

    题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉树的后序遍历也就是先访问左子树,再访问右 ...

  6. 剑指offer23:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。输出Yes OR No。

    1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 2 思路和方法 二叉搜索树:二叉查找树(Bin ...

  7. P140、面试题24:二叉搜索树的后序遍历序列

    题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 测试用例: 1)功能测试(输入的后序遍历的序列 ...

  8. [PHP]算法- 判断是否为二叉搜索树的后序遍历序列的PHP实现

    二叉搜索树的后序遍历序列: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 1.后序遍历是 左右中 ...

  9. 二叉搜索树的后序遍历序列(python)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. # -*- coding:utf-8 -*- cl ...

随机推荐

  1. .ignore配置问题1:配置后所忽略的文件不起作用

    gitignore可以指定git忽略指定文件. 问题: 想忽略一些文件在.gitignore文件中会配置对应的文件,但是有时候配置后还是没有起作用: 我在element-ui封装个性化组件时,需要更换 ...

  2. Codeforces 455D 分块+链表

    题意: 给定一个长度为 N 的序列两种操作1 l r 将[l,r]的数向右循环移位 2 l r 询问[l,r]内有多少个数等于 k其中 N,Q≤105,ai≤N 强制在线 思路: 1. 每块用一个链表 ...

  3. IOS开发之Swift学习笔记

    1.因为存储属性要求初始化,我们可以使用lazy修饰符来延迟初始化.

  4. JS压缩图片(canvas),返回base64码

    上传图片时总会遇到图片过大上传不上去的问题,本方法是在网上搜的压缩图片的例子,我测试过了,确实能用,但是照搬别人的代码,发现压缩后图片会失真,不清晰,现经修改图片清晰度还可以,不仔细看差别不大,so, ...

  5. [转]STL之deque容器详解

    Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中 ...

  6. [Android]有关外部链接唤醒App需要注意的坑

    移动互联网发展到今天,一个移动app需要和各种各样的外部链接关联,它不再仅仅从手机的桌面启动,更多的将会从其他的应用.浏览器链接.短信.二维码或者微信分享等渠道启动,这里涉及到的是各种各样的营销渠道和 ...

  7. JS——标记

    continue 语句(带有或不带标签引用)只能用在循环中.break 语句(不带标签引用),只能用在循环或 switch 中.通过标签引用,break 语句可用于跳出任何 JavaScript 代码 ...

  8. Android ExpandableListView的使用详解

    ExpandableListView(可扩展的ListView) ExpandableListVivew是ListView的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组 ...

  9. dnn 添加图片

    public string fileUpload()         {             if (fuPhoto.PostedFile != null && fuPhoto.P ...

  10. 【sqli-labs】 less50 GET -Error based -Order By Clause -numeric -Stacked injection(GET型基于错误的整型Order By从句堆叠注入)

    报错没有关闭,直接可以用UpdateXml函数 http://192.168.136.128/sqli-labs-master/Less-50/?sort=1 and UpdateXml(1,conc ...