1.链表和数组的区别:
数组:
利用索引(下标)随机访问。
数组要求分配一块连续的地址空间,每一个元素是顺序相临的。
插入与删除需要对整个数组进行调整(也就是说,需要移动各个元素)。
链表:
只能够顺序查找。
链表不要求一块连续的地址空间,也就是说,元素是分开存放的。
链表的插入与删除效率非常高(只需要改变指针的指向)。
2.排序二叉树(查找二叉树)
(1)树(了解)
(2)什么是排序二叉树?
(3)二叉树的遍历
1)先序遍历(了解): 先访问根节点,然后先序遍历左子树,最后先序遍历右子树。
2)中序遍历(重点):先中序遍历左子树,然后访问根节点,最后中序遍历右子树。
3)后序遍历(了解):先先序遍历左子树,然后先序遍历右子树,最后访问根节点。
(4)实现排序二叉树
代码实现:
package tree;
/**
* 这是一个排序二叉树(查找二叉树)
*/
public class Tree<E extends Comparable<E>> {
//root存放的是根节点的地址
private Node root;
/*
Node类用于描述二叉树当中的某个节点,其中,data存放
数据(元素),left和right存放的是其左右子树的地址。
*/
class Node{
E data;
Node left;
Node right;
Node(E e){
data = e;
}
/*
将某个元素添加到该节点下面
*/
public boolean append(E e){
if(data.compareTo(e) == 0){
//排序二叉树不允许重复元素
return false;
}
if(data.compareTo(e) > 0){
//要添加的元素比当前元素要小,则添加到左子树
if(left == null){
//如果左子树为空,则当前元素成为左子树
left = new Node(e);
return true;
}else{
//如果左子树不为空,则添加到该节点的左子树的下面(递归)
return left.append(e);
}
}else{
if(right == null){
right = new Node(e);
return true;
}else{
return right.append(e);
}
}
}
/*
* 这是一个中序遍历方法
*/
public void inOrder(StringBuilder sb){
//如果当前节点的左子树不为空,则中序遍历其左子树
if(left != null){
left.inOrder(sb);
}
//访问根节点
sb.append(data + ",");
//如果当前节点的右子树不为空,则中序遍历其右子树
if(right != null){
right.inOrder(sb);
}
}
}
/**
* 向二叉树当中添加一个元素
* @param e 被添加的元素
* @return 添加成功返回true。
*/
public boolean add(E e){
Node node = new Node(e);
if(root == null){
//如果树为空,也就是说根节点值为null,则新添加的节点成为根节点。
root = node;
return true;
}
//如果树不为空,则将该元素添加到根节点的下面
return root.append(e);
}
@Override
public String toString() {
if (root == null){
return "[]";
}
StringBuilder sb = new StringBuilder("[");
/*
调用根节点的中序遍历方法。
inOrder方法中遍历过程当中,会将各个节点的值添加到
StringBuilder对象里面。
*/
root.inOrder(sb);
//除掉最末那个","
sb.delete(sb.lastIndexOf(","),sb.length());
return sb.append("]").toString();
}
}
测试代码:
package tree;
public class TreeTest {
public static void main(String[] args) {
Tree<Integer> tree = new Tree<>();
tree.add(88);
tree.add(66);
tree.add(55);
tree.add(120);
System.out.println("tree:" + tree);
}
}
3.红黑树(了解)
(1)什么是红黑树?
是一个自平衡的排序二叉树(查找二叉树)。
(2)红黑树的特点