基本操作: {结构初始化} InitTree(&T); 操作结果:构造空树 T。 CreateTree(&T,definition); 初始条件:definition 给出树T的定义。 操作结果:按 definition 构造树 T。 {销毁结构} DestroyTree(&T); 初始条件:树 T 存在。 操作结果:销毁树 T。 {引用型操作} TreeEmpty(T); 初始条件:树 T 存在。 操作结果:若 T 为空树,则返回 TRUE,否则返回 FALSE。 |
可以多种形式给出树的定义。例如,上页图所示树可由13个数据元素组成的集合和关系 R 唯一确定。 此外,可从另一个角度来定义树。 定义森林为 m(m≥0) 棵互不相交的树的集合。 则可定义树是一个二元组 Tree = ( root,F ) 其中,root 是数据元素,称作树的根,F 是子树森林,记作 F=( T1,T2,…,Tm ), 其中 Ti=(ri,Fi) 称作根 root 的第 i 棵(符合本定义的)子树,当 m≠0 是,在树根和其子树森林之间存在下列关系: RF={<root,ri>|i=1,2,…,m, m>0} |
|||
TreeDepth(T); 初始条件:树T存在。 操作结果:返回T的深度。 Root(T); 初始条件:树 T 存在。 操作结果:返回 T 的根。 Value(T, cur_e); 初始条件:树 T 存在,cur_e 是 T 中某个结点。 操作结果:返回 cur_e 的值。 |
树的深度定义为树中叶子结点所在最大层次数。
|
|||
Parent(T, cur_e); 初始条件:树 T 存在,cur_e 是 T 中某个结点。 操作结果:若 cur_e 是T的非根结点,则返回它的双亲,否则返回"空"。 LeftChild(T, cur_e); 初始条件:树 T 存在,cur_e 是 T 中某个结点。 操作结果:若 cur_e 是T的非叶子结点,则返回它的最左孩子, 否则返回"空"。 |
称根结点为子树根的"双亲"。 称子树根为根结点的"孩子",所谓"最左孩子"指的是在存储结构中存放的第一棵子树的根。虽然无序树的子树之间逻辑上不存在次序关系,但一旦建立了存储结构,子树间的次序关系也就自然形成了。 |
|||
RightSibling(T, cur_e); 初始条件:树 T 存在,cur_e 是 T 中某个结点。 操作结果:若 cur_e 有右兄弟,则返回它的右兄弟,否则返回"空"。 TraverseTree(T, visit()); 初始条件:树T存在,visit 是对结点操作的应用函数。 操作结果:按某种次序对 T 的每个结点调用函数 visit() 一次且至多一次。 一旦 visit() 失败,则操作失败。 {加工型操作} Assign(T, cur_e, value); 初始条件:树T存在,cur_e 是 T 中某个结点。 操作结果:结点 cur_e 赋值为 value。 ClearTree(&T); 初始条件:树 T 存在。 操作结果:将树 T 清为空树。 |
根的所有子树根互为"兄弟"。同前所述理由, "右兄弟"指存储结构中确定的有相同双亲的下一棵子树的根。 | |||
InsertChild(&T, &p,
i, c); 初始条件:树 T 存在,p 指向T中某个结点,1≤i≤p 所指结点的度+1, 非空树 c 与 T 不相交。 操作结果:插入 c 为 T 中 p 所指结点的第 i 棵子树。 DeleteChild(&T, &p, i); 初始条件:树 T 存在,p 指向 T 中某个结点,1≤i≤p 指结点的度。 操作结果:删除 T 中 p 所指结点的第 i 棵子树。 } ADT Tree |
对无序树而言,第i棵子树的概念也仅对存储结构中子树的次序而言。 |