今天学习了树这一种数据结构,记录一下。
1.什么是二叉树:
在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉搜索树和二叉堆
2.如何实现二叉树:
首先我们需要先定义一个范型类,这个范型类传进来的参数必须是可比较类型的,不然实现二叉树毫无意义
public class BST<E extends Comparable<E>> {
}
然后,我们可以定义一个内部,当然,也可以在其他地方定义类,我这里纯粹是为了容易看。
private class Node {
E e; //节点值
Node left;//左节点 也可以叫左子树的根节点
Node right; //右节点 也可以叫右子树的根节点
public Node(E e) {
//每生成一个新的节点,他的左子节点和右子节点都应该为空
this.e = e;
this.left = null;
this.right = null;
}
}
理解了上面的定义之后,我们就可以开始定义我们的根节点了
先定义两个变量,第一个是树的根节点,第二个变量用来记录树的节点个数
private Node root;//根节点
private int size ; // 节点个数
定义增加节点方法
这里我用递归的形式实现的,因为递归的方式比较简单,也好理解,有更好的办法请大佬们在评论区评论出来。
public void add(E e){
// 根据oop 的封装思想,给顾客调用的都是简单的逻辑,即调用某一个方法,但是,在这一个方法里面又调用了另一个复杂的方法,这个是顾客看不到的,复杂的方法不应该让顾客看见,即只展示结果,不展示过程
root = add(root,e);//调用另一个递归方法,返回一个全新的根节点
}
private Node add(Node node,E e){
if(node == null){
//如果当前节点为空,直接返回一个新的节点
size++;
return new Node(e);
} //相当于return add 但是这里我们应该要返回的是整一个node 所以拿node的右节点来接收
if(node.e.compareTo(e) < 0) node.right = add(node.right,e);//如果当前节点的值大于传进来的节点,那么就划分到这个节点的右节点,继续判断(记得一定要拿对应的变量去接收,不然数据会丢失)
else if(node.e.compareTo(e) > 0) node.left = add(node.left,e);//如果当前节点的值小于传进来的节点,那么就划分到这个节点的左节点节点,继续判断
return node;//最后返回这个树所对应的所有节点(根节点)(根节点底下有许多的子节点,组成了树)
}
判断节点是否存在的方法
public