一、基本概念
- 二叉树:每个节点最多有两个子树的结构;
- 满二叉树:除了最后一层没有任何节点外,每一层的所有节点都有两个子节点的二叉树;
- 完全二叉树:结构与满二叉树类似,不同点在于最后一层可以不满,但最后一层的节点必须连续集中再最左边;
- 二叉搜索树:各节点的值有大小要求的二叉树,左节点的值<中节点的值<右节点的值。
二、树的存储方式
1、数组形式
使用数组存储,有一个特点就是必须连续存储,根据树的结构,满二叉树和完全二叉树可以对树的元素从上到下,从左到右进行连续存储,但是对于一般的二叉树,必须进行完全化才可以进行数组存储。所谓的完全化,就是对于没有子节点的位置,使用null代替,构成完全二叉树的结构。那么问题就来了,使用null存储,也是会占用存储空间的,所以对树的存储方式,一般采取链表的形式。
2、链表形式
链表形式可以分为两类:二叉链表和三叉链表。
二叉链表存储,包含三个信息,左孩子节点指针,右孩子节点指针,以及数据域。如果没有孩子节点,则将指针域置为NULL。使用二叉链表结构,一般会创建一个头节点,并将其中的左子树指向根节点,右子树为NULL,这样方便了后续的操作。
三叉链表存储,除了含有二叉链表的结构外,还含有一个双亲节点指针域,指向它的双亲节点。这是典型的空间换时间的方法,如果涉及的操作需要频繁访问双亲节点,就建议使用三叉链表的存储结构。
对于一般的二叉树而言,二叉链表存储是最简单有效的方式,也是推荐使用的。
三、树的实现
package com.cjs.bean;
public class Node {
private int id;
private int data;
private Node leftChild;
private Node rightChild;
public Node() {
}
public Node(int id, int data, Node leftChild, Node rightChild) {
this.id = id;
this.data = data;
this.leftChild = leftCh