树形结构是一类重要的非线性数据结构。其中以树和二叉树最为常用。
树的概念
树是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() + " "); } } }