二叉树定义: 每个节点最多含有两个子树的树称为二叉树,通常子树被称作“左子树(left subtree)”和“右子树(right subtree)”,有左右之分,次序不能颠倒; 二叉树分类: 1.完全二叉树:对于一棵二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树; 2.满二叉树:对于上述的完全二叉树,如果去掉其第d层的所有节点,那么剩下的部分就构成一个满二叉树(此时该满二叉树的深度为d-1); 二叉树存储: 连续存储(以完全二叉树存储) 二叉树可以用数组或线性表来存储。如果一个节点的索引为i,它的子节点能在索引2i+1和2i+2找到,并且它的父节点能在floor((i-1)/2)找到(根节点索引为0)。 链式存储二叉树的访问: 树的遍历先序(DLR)、中序(LDR)、后序(LRD)。 先序遍历: 1、访问根节点; 2、再先序访问左子树; 3、再先序访问右子树; 遍历结果为:1 2 4 8 5 3 6 7 中序遍历: 1、访问左子树; 2、访问根节点; 3、访问右子树; 遍历结果为:8 4 2 5 1 3 6 7 后序遍历: 1、访问右子树; 2、访问左子树; 3、访问根节点; 遍历结果为:8 4 5 2 6 7 3 1 已知先序和中序,或者已知中序和后序即可还原原始二叉树: 例如通过先序和中序求原始二叉树的思路如下: 1、先序先访问根节点,通过先序序列可以得出1为树的根; 2、中序先访问左子树,通过中序序列可以得出8 4 2 5 为根左子树的子孙,3 6 7 为根右子树的子孙; 3、左子树8 4 2 5这4个子孙中,子孙2在先序序列中最靠前,可以得出2为左子树的根; 4、以此类推。 将n叉树转换为二叉树: 将每个节点的左子节点指向他的第一个孩子节点,右子节点指向他的下一个兄弟节点。/** * 二叉树链式存储的数据结构 */ public class BinNode { /*节点数据*/ private Object data; /*左子节点引用*/ private Node leftNode; /*右子节点引用*/ private Node rightNode; public BinNode(Object data, Node leftNode, Node rightNode) { this.data = data; this.leftNode = leftNode; this.rightNode = rightNode; } }