二叉树就是每个结点最多有两个子节点,分别称为左孩子节点和右孩子节点,具体的存储方式有基于指针的链式存储和基于数组的顺序存储,最常见的是基于指针的方式(基于数组的方式浪费内存)。
各类二叉树的区别:
满二叉树: 每个结点都有左右子节点
完全二叉树: 叶子节点分布在层次结构的最下面或者倒数第二层,最下面一层的叶子节点都靠左排列。除了最下面一层,其他接电都是饱和的,并且最下层的结点都集中在该层最左边的若干位置上。(满二叉树是特殊的完全二叉树)
代码实现:
public class MyTree{
private Node tree; //根
public static class Node{
private int data; //存储数据
private Node left; //左子树
private Node right; //右子树
public Node(int data){
this.data = data;
}
}
//插入
public void insert(int data) {
if (tree == null) { //根节点为空则创建根节点
tree = new Node(data);
return;
}
Node p = tree;
while (p != null) { //父节点不为空
if (data > p.data) { //将传入的数值与根节点的数值进行比较,大于父节点放右节点
if (p.right == null) { //向下查找是否有子节点
p.right = new Node(data);
return;
}
p = p.right;
} else {//将传入的数值与根节点的数值进行比较,小于父节点放左节点
if (p.left == null) {
p.left = new Node(data);
return;
}
p = p.left;
}
}
}
//删除
public void delete(int data) {
Node p = tree;
Node pp = null;
while (p != null && p.data != data) {
pp = p;
if (data > p.data) p = p.right;
else p = p.left;
}
if (p == null) return;
if (p.left != null && p.right != null) {
Node minp = p.right;
Node minpp = p;
while (minp.left != null) {
minpp = minp;
minp = minp.left;
}
p.data = minp.data;
p = minp;
pp = minpp;
}
Node child = null;
if (p.left != null) child = p.left;
if (p.right != null) child = p.right;
if (pp == null) tree = child;
else if (pp.left == p) pp.left = child;
else pp.right = child;
}
public String toString() {
return "MyTree{" + "tree=" + tree + '}';
}
public static void main(String[] args) {
MyTree tree = new MyTree();
tree.insert(4);
tree.insert(5);
tree.insert(2);
tree.insert(3);
tree.insert(1);
System.out.println(tree.toString());
}
}