树结构
树是由一个集合以及在该集合上定义的一种关系构成的。
集合中的元素称为树的结点,所定义的关系称为父子关系。
父子关系在树的结点之间建立了一个层次结构。
在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或简称为树根。
没有子结点的结点称为叶子结点。
(1)结点的层次和树的高度(深度)
结点的层次(level)从根开始定义,层次数为0的结点是根节点,其子树的根的层次为1.。。。。。。
数中的结点的最大层次数称为数的深度(Depth)或者高度,数中结点也有高度,其高度是以该结点为根的树的高度。
(2)结点的度与树的度
结点拥有的子树的数目称为结点的度(Drgree)
度为0的结点称为叶子(leaf)结点。度不为0的结点称为非终端结点或者分支结点。除根之外的分支结点也称为内部结点。
性质:树中的结点数等于树的边数加1,也等于所有结点的度数之和加1
(3)路径
在树中k+1个结点通过k条边连接构成的序列,称为长度为k的路径。
树中任意两个结点之间都存在唯一的路径。这意味着树既是连通的,同时他又不会出现环路。从根结点开始,存在到其他任意结点的一条唯一路径,根到某个结点路径的长度,恰好是该结点的层次数。
(4)m叉树、森林
树中所有结点最大度数为m的有序树称为m叉树。
二叉树:
每个结点最多只能有两个子结点的一种树形式。
二叉树的子节点分为左节点和右节点。
如果该二叉树的所有叶子节点都在最后一层,并且结点总数=2^n-1,n为层数,则我们称为满二叉树。
如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。
森林(forset)是m(m>=0)棵互不相交的树的集合。对树中的每个结点而言。其子树的集合即为森林。树和森林的概念相近,删去一棵树的根,就得到一个森林,反之,加上一个结点作树根,森林就变成一棵树。
二叉树的遍历
前序遍历:先输出父结点,再遍历左子树和右子树;
中序遍历:先遍历左子树,再输出父节点,再遍历右子树;
后序遍历:先遍历左子树,再遍历右子树,最后再输出父节点。
思路:
1.创建一棵二叉树。
2.前序遍历
(1)先输出当前节点,
(2)如果左子结点不为空,则继续递归前序遍历
(3)如果右子节点不为空,则继续递归前序遍历
3.中序遍历
(1)如果当前节点的左子节点不为空,则递归中序遍历
(2)输出当前节点(初始的时候是root节点)
(3)如果当前节点的右子结点不为空,则递归中序遍历
4.后序遍历
(1)如果当前节点的左子节点不为空,则递归后序遍历
(2)如果当前节点的右子结点不为空,则递归后序遍历
(2)输出当前节点(初始的时候是root节点)
/**
* 前序遍历
*/
public void preOrder() {
//先输出父节点
System.out.println(this);
//递归向左子树前序遍历
if (this.left != null) {
this.left.preOrder();
}
//递归向右节点前序遍历
if (this.right != null) {
this.right.preOrder();
}
}
/**
* 中序遍历
*/
public void infixOrder() {
//递归向左子树中序遍历
if (this.left != null) {
this.left.preOrder();
}
//输出父节点
System.out.println(this);
//递归向右子树中序遍历
if (this.right != null) {
this.right.infixOrder();
}
}
/**
* 后序遍历
*/
public void postOrder() {
if (this.left != null) {
this.left.preOrder();
}
if (this.right != null) {
this.right.postOrder();
}
System.out.println(this);
}