结点。
结点的度、树的度:
叶子结点、分支结点:
孩子结点、双亲结点、兄弟节点:
子树
的根结点
称为该结点的孩子结点
(children node)孩子结点
的双亲结点
(parent node)路径、路径长度:
路径
,路径上经过的边数称为路径长度
。祖先、子孙:
结点的层数、树的深度(高度)、树的宽度:
ADT Tree DataModel 树由一个根节点和若干颗子树构成,树中结点具有层次关系。 Operation initTree 输入:无 功能:初始化一棵树 输出:一棵树 preOrder 输入:无 功能:前序遍历树 输出:树的前序遍历序列 postOrder 输入:无 功能:后序遍历树 输出:树的后序遍历序列 leverOrder 输入:无 功能:层序遍历树 输出:树的层序遍历序列 endADT
树的遍历是指从根节点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。
若树为空,则空操作返回;否则执行以下操作
若树为空,则空操作返回;否则执行以下操作
定义如下:
public class ParentNode<T>{ private T data; //定义结点泛型数据域 private int parent; //定义结点双亲下标 public T getData(){return data;} public void setData(T element){data = element;} public int getParent(){return next;} public void setParent(int parent){this.parent=parent;} }
下图中,根节点的parent为-1,表示没有双亲。
孩子结点:
public class ChildNode{ private int child; //结点对应头结点下标 private ChildNode next; //引用下一个孩子 public int getChild(){return child;} public void setChild(int child){this.child=child;} public ChildNode getNext(){return next;} public void setNext(ChildNode next){this.next=next;} }
头结点:
public class TreeNode<T>{ private T data; //定义结点泛型数据域 private ChildNode firstChild; //孩子链表头引用 public T getData(){return data;} public void setData(T data){this.data=data;} public ChildNode getFirstChild(){return firstChild;} public void setFirstChild(ChildNode firstChild){ this.firstChild=firstChild; } }
每个结点记录自己的长子和右兄弟
又称为二叉链表表示法
除了每个结点的数据域之外,设置两个引用域分别引用该结点的第一个孩子和右兄弟,链表的结构如下所示。
firstChild存储第一个孩子引用,rightSib存储右兄弟引用。