目录
树结构
一、为什么要有树结构
树结构本身是一种天然的组织结构
高效
二、二分搜索树的基础
1、二叉树
性质:和链表一样,动态数据结构;二叉树具有唯一的根节点,二叉树每个节点最多有两个孩子,二叉树每个节点最多有一个父亲。
二叉树 具有天然递归结构;每个节点的左子树和右子树也是二叉树
Class Node{
E e;
Node left;
Node right;
}
总结:(1)叶子节点出现在二叉树的最底层,除叶子节点之外的其他节点都有两个孩子节点
(2)一个层数为k的满二叉树总结点数为:2^(k)-1
(3)第i层上的节点数为:2^(i-1)
(4)二叉树不一定是“满”的
2、二分搜索树
(1)二分搜索树是二叉树
(2)二分搜索树的每个节点的值:
大于其左子树的所有节点的值
小于其右子树的所有节点的值
(3)每一棵树也是二分搜索树
三、向二分搜索树添加元素
创建一个数组,向二分搜索树添加元素
int[] arr = {
28, 23, 15, 56, 34, 78};
BinarySearch<Integer> bs = new BinarySearch<>();
for (int i = 0; i < arr.length; i++) {
bs.add(arr[i]);
}
二分搜索树的图为:
private Node add(Node root, T ele) {
//如果根节点为空,创建一个新得二叉树,传ele参数进去
if (root == null) {
Node node = new Node(ele);
return node;
}
//根节点不为空,将要添加的元素与跟的值进行比较大小
//递归操作 不考虑等于的情况
if (ele.compareTo(root.val) > 0) {
root.right = add(root.right, ele);
} else {
root.left = add(root.left, ele);
}
return root;
}
四、查询是否包含某个元素
//2、查询二叉树节点是否包含节点
public Node contains(T ele) {
return contains(root, ele);
}
private Node contains(Node root, T ele) {
if (root == null) {
return null;
}
//递归
T val = root.val;
if (ele.compareTo(val) == 0) {
return root;
} else if (ele.compareTo(val) > 0) {
return contains(root.right, ele);
} else {
return contains(root.left, ele);
}
}
五、前序遍历
中左右
//3、前序遍历
public List<T> preorder() {
List<T> list = new LinkedList<>();
preorder(root, list);
return list;
}
private void preorder(Node root, List<T> list) {
//遍历到最后
if (root == null) {
return;
}
//中左右 遍历左边 返回根节点 遍历右边
list.add(root.val);
middleorder(root.left, list);
middleorder(root.right, list);
return;
}
六、中序遍历
左中右
//3、中序遍历 (按顺序)
public List<T> middleorder() {
List<T> list = new LinkedList<>();
middleorder(root, list);
return list;
}
private void middleorder(Node root, List<T> list) {
//遍历到最后
if (root == null