树
一种用于表达层级结构的数据结构,常用来表达文档、组织结构图、图形图像等。在此主要介绍树的表达方式以及相关基本算法。
1. 有根树
要求获得有根树中各节点的信息,如:节点编号、节点种类(根、内部节点、叶)、父节点编号、子节点编号、节点深度等。
采用“左子右兄弟表示法”来表示有根树(父节点、最左侧子节点、右侧紧邻的兄弟节点)
struct Node { int parent, int left, int right} struct Node T[MAX];
getGepth(u) d = 0 while T[u].parent != NIL // NIL用作一个特殊的节点编号 u = T[u].parent d++ return d //子节点列表 printChildren(u) c=T[u].left while c != NIL print c c = T[c].right
2. 二叉树
设给定二叉树有n个节点,编号分别为0至n-1 (节点编号、深度、父节点、高、兄弟节点、种类、子节点)
struct Node { int parent, int left, int right}
// 节点的高 setHeight(H, u) h1 = h2 =0 if T[u].right != NIL h1 = setHeight(H, T[u].right) + 1 if T[u].left != NIL h2 = setHeight(H, T[u].left) + 1 return H[u] = max(h1, h2)
3. 树的遍历(左子树始终处于右子树前面)
a. 前序
按照根节点、左子树、右子树的顺序输出节点编号,伪代码如下:
PreParse(u) if u == NIL // 表示没有后续节点 return print u preParse(T[u].left) preParse(T[u].right)
b. 中序
按照左子树、根节点、右子树的顺序输出节点编号,伪代码如下:
InParse(u) if u == NIL // 表示没有后续节点 return InParse(T[u].left) print u InParse(T[u].right)
c. 后序
按照左子树、右子树、根节点的顺序输出节点编号,伪代码如下:
PostParse(u) if u == NIL // 表示没有后续节点 return PostParse(T[u].left) PostParse(T[u].right) print u