我们在前面学习的数组。链表等等,是都呈线性排列的,因此我们称作线性结构,我们今天来学习数据结构中的树结构。
树结构本身就是一种天然的组织结构,我们为什么要使用树结构呢?答案就是因为树结构高效。
二叉树和链表一样具有动态结构。
二叉树顾名思义就是一个节点分为两个,也就是有左右节点,然后在以此类推,注意二叉树有唯一一个根节点如果最后不能再进行分叉了,那个这些节点称为叶子结点,我们将左右节点称为 称为左孩子和右孩子对应的就有了父亲节点,对此我们需要注意:
二叉树每个节点最多有俩个孩子。每个节点最多只有一个父亲。(根节点没有父亲节点)
二叉树具有天然的递归结构如果左孩子也是一个父亲节点那我们将左孩子的分支叫做左子树,每个节点的左子树也是一个二叉树,同理右子树也是一个二叉树(要注意二叉树不一定是满的,一个节点也是二叉树,空也是一个二叉树)
二分搜索树也是一颗二叉树
二分搜索树,每个节点的值
1.大于左子树的所有节点的值
2.小于右子树的所有节点的值
3.每一颗子树也是二分搜索树
4.二分搜索树具有顺序性
4.存储的数据具有可比较性(局限性)(继承Comparable类或者实现CompareTo接口)
具体代码如下:
public class BST<E extends Comparable<E>> {
private class Node{
public E e;
public Node left,right;
public Node(E e) {
this.e = e;
left = null;
right = null;
}
}
private Node root;
private int size;
public BST() {
root = null;//根节点
size = 0;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
}
二分搜索树添加元素(不包含重复元素,如果想要包含的话,那么就需要左子树小于等于根节点,同理右子树也是一样大于等于根节点)
添加元素也就是利用二分搜索树的性质,也就是用元素与根节点进行比较,小的放左边,大的放右边,如果根节点为null,那么元素就等于根节点具体的实现代码如下
//向二分搜索树种添加新的元素e
public void add(E e) {
if(root == null) {
root = new Node(e);
size++;
}else {