package 树;
/**
* 定义一个结点
*/
class Node{
Node left = null;
Node right = null;
Integer data;
public Node(Integer data){
this.data = data;
}
}
public class BinarySearchTree {
Node root = null;
/**
* 添加元素
*/
public void addNode(Integer data){
Node node = new Node(data);
if(root == null){
root = node;
return;
}
Node temp = root;
while(true){
if(data<temp.data){//小于的情况
if(temp.left == null){
temp.left = node;
return;
}else{
temp = temp.left;
}
}else if(data>temp.data){//大于的情况
if(temp.right == null){
temp.right = node;
return;
}else{
temp = temp.right;
}
}else{ //相等的情况(去重复)
return;
}
}
}
/**
* 删除元素
* 思路:
* 如果节点是叶子结点,可以直接删除。
* 如果节点有一个子节点,则将父节点直接指向其子节点。
* 如果节点有两个子节点(最为复杂),用其右子树中的最小的数据代替该节点的数据并递归地删除那个节点。
*/
/**
* 判断是否包含某元素
*/
public boolean isContains(Integer data){
if(root == null){
return false;
}
Node temp = root;
while(true){
if(data<temp.data){//小于的情况
if(temp.left == null){
return false;
}else{
temp = temp.left;
}
}else if(data>temp.data){//大于的情况
if(temp.right == null){
return false;
}else{
temp = temp.right;
}
}else{ //相等的情况
return true;
}
}
}
/**
* 求二叉搜索树的高度
*/
public int getHeight(){
return getHeight(root);
}
private int getHeight(Node node) {
if(node == null){
return 0;
}
int i = getHeight(node.left);
int j = getHeight(node.right);
return (i>j)?i+1:j+1;
}
/**
* 求二叉搜索树的节点个数
*/
public int getSize(){
return getSize(root);
}
private int getSize(Node node) {
if(node == null){
return 0;
}
return 1+getSize(node.left)+getSize(node.right);
}
/**
* 求二叉搜索树中的最大值
*/
public Integer getMax(){
if(root == null){
return null;
}
Node temp = root;
while(temp.right!=null){
temp = temp.right;
}
return temp.data;
}
/**
* 求二叉搜索树中的最小值
*/
public Integer getMin(){
if(root == null){
return null;
}
Node temp = root;
while(temp.left!=null){
temp = temp.left;
}
return temp.data;
}
/**
* 前序遍历方法递归实现
*/
public void preOrder(){
preOrder(this.root);
}
private void preOrder(Node node) {
if(node == null){
return;
}else{
System.out.print(node.data+" ");
preOrder(node.left);
preOrder(node.right);
}
}
/**
* 中序遍历方法递归实现
*/
public void midOrder(){
midOrder(this.root);
}
private void midOrder(Node node) {
if(node == null){
return;
}else{
midOrder(node.left);
System.out.print(node.data+" ");
midOrder(node.right);
}
}
/**
* 后序遍历方法递归实现
*/
public void aftOrder(){
aftOrder(this.root);
}
private void aftOrder(Node node) {
if(node == null){
return;
}else{
aftOrder(node.left);
aftOrder(node.right);
System.out.print(node.data+" ");
}
}
/**
* 主函数
*/
public static void main(String[] args) {
BinarySearchTree bst = new BinarySearchTree();
//构建二叉搜索树
int[] arr = {2,4,5,1,3,9,7,8,6};
for(int i:arr){
bst.addNode(i);
}
System.out.println("中序遍历:");
bst.midOrder();
System.out.println();
System.out.println("前序遍历:");
bst.preOrder();
System.out.println();
System.out.println("后序遍历:");
bst.aftOrder();
System.out.println();
System.out.println("二叉搜索树的高度为:"+bst.getHeight());
System.out.println("二叉搜索树的节点个数为:"+bst.getSize());
System.out.println("二叉搜索树是否包含元素2?"+bst.isContains(2));
System.out.println("二叉搜索树的最大节点为:"+bst.getMax());
System.out.println("二叉搜索树的最小节点为:"+bst.getMin());
}
}