树形结构是一类重要的非线性数据结构。其中以树和二叉树最为常用。
树的概念
树是n(n≥0)个结点的有限集。在任意一颗非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,...,Tm,其中每一个集合本身又是一颗树,并且称为根的子树。
树的基本术语
树的结点包含一个数据元素以及若干指向其子树的分支。结点拥有的子树数称为结点的度。度为0的结点称为叶子或终端结点。度不为0的结点称为非终端结点或分支结点。除根节点之外,分支结点也称为内部结点。树的度是树内各结点度的最大值。结点的子树的根称为该结点的孩子,相应的该结点称为孩子的双亲。同一个双亲的孩子之间互称为兄弟。结点的祖先是从根到该节点所经历分支上的所有的结点。反之,以某结点为根的子树中的任一结点都称为该节点的子孙。结点的层次从根开始定义,树中结点的最大层次称为根的深度或高度。
二叉树的概念
二叉树是另一种树型结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,不能随意颠倒顺序。
二叉树可以有5种基本的形态:
package arithmetic;
public class BiTreeImpl implements BiTreeOpI {
static BiTree root;
@Override
public void createBiTree() {
root = new BiTree(1);
BiTree leftChild = new BiTree(2);
root.setLeftChild(leftChild);
BiTree rightChild = new BiTree(3);
root.setRightChild(rightChild);
leftChild.setLeftChild(new BiTree(4));
leftChild.setRightChild(new BiTree(5));
rightChild.setLeftChild(new BiTree(6));
rightChild.setRightChild(new BiTree(7));
}
public static void main(String[] args) {
BiTreeImpl biTreeImpl = new BiTreeImpl();
biTreeImpl.createBiTree();
System.out.print("先序:");
biTreeImpl.preOrderTraverse(root);
System.out.println();
System.out.print("中序:");
biTreeImpl.inOrderTraverse(root);
System.out.println();
System.out.print("后序:");
biTreeImpl.postOrderTraverse(root);
}
@Override
public void preOrderTraverse(BiTree root) {
if(root != null) {
System.out.print(" " + root.getData() + " ");
preOrderTraverse(root.getLeftChild());
preOrderTraverse(root.getRightChild());
}
}
@Override
public void inOrderTraverse(BiTree root) {
if(root != null) {
preOrderTraverse(root.getLeftChild());
System.out.print(" " + root.getData() + " ");
preOrderTraverse(root.getRightChild());
}
}
@Override
public void postOrderTraverse(BiTree root) {
if(root != null) {
preOrderTraverse(root.getLeftChild());
preOrderTraverse(root.getRightChild());
System.out.print(" " + root.getData() + " ");
}
}
}