java实现二分搜索树_简单用Java实现二分搜索树

二叉树由节点(Node)组成,每个节点包含一个“左”指针(left)、“右”指针(right)和一个数据元素(e)。

“根”(root)指针指向树中最顶端的节点。左右指针递归地指向较小的

两边的“子树”。空指针表示没有元素的二叉树——空树。正式的递归定义是:二叉树要么为空(由空指针表示),要么由单个节点构成,

其中左指针和右指针(前面是递归定义)都指向一个二叉树。

87556058279fbae446c7e2ba7bea97c4.png

上图是一棵二分搜索树(BST):

二分搜索树是二叉树

二分搜索树的每个节点的值都大于其左子树的所有节点的值,小于其右子树的所有节点的值(1,3,4)<5

其中(1,4,6)是树的叶子节点,因为其节点的left和right指针是空子树。

由于二分搜索树具有元素之间比较的特点,所以二分搜索树存储的元素类型应该要具有可比较性。可以为二分搜索树添加泛型E,并且E extends Comparable

这里我的二分搜索树存储的元素类型就指定为int,且其他方法都用递归实现

public class BST {

private class Node {

int e;

Node left;

Node right;

public Node(int e) {

this.e = e;

left = null;

right = null;

}

}

private Node root;

private int size;

public BST() {

this.root = null;

this.size = 0;

}

}

查找方法:

public boolean lookup(Node node,int target){

//最基本的情况:空树,找不到目标,所以返回false

if (node == null)

return false;

//如果不为空,则根据值来判断

else {

if (target == node.e)

return true;

else {

if (target < node.e)

return lookup(node.left,target);

else return lookup(node.right,target);

}

}

}

插入元素方法:

public void insert(int data){

root = insert(root,data);

}

private Node insert(Node node,int data){

//如果节点是空的,则返回一个新的节点,值为data

if (node == null){

size++;

return new Node(data);

}

//如果节点不为空,则根据data和e对比

else {

if (data < node.e) node.left = insert(node.left,data);

else node.right = insert(node.right,data);

return node;

}

}

getSize方法:

public int getSize(){

return size;

}

获取树的最大深度方法:

public int maxDepth(){

return maxDepth(root);

}

private int maxDepth(Node node){

if (node == null)

return 0;

else {

int lDepth = maxDepth(node.left);

int rDepth = maxDepth(node.right);

return Math.max(lDepth,rDepth)+1;

}

}

先序遍历、中序遍历、后序遍历:

public void preOrder(){

preOrder(root);

}

private void preOrder(Node node){

if (node == null)

return;

System.out.println(node.e);

preOrder(node.left);

preOrder(node.right);

}

public void inOrder(){

inOrder(root);

}

private void inOrder(Node node){

if (node==null)

return;

inOrder(node.left);

System.out.println(node.e);

inOrder(node.right);

}

public void postOrder(){

postOrder(root);

}

private void postOrder(Node node){

if (node==null)

return;

postOrder(node.left);

postOrder(node.right);

System.out.println(node.e);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值