一种用于表达层级结构的数据结构,常用来表达文档、组织结构图、图形图像等。在此主要介绍树的表达方式以及相关基本算法。

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

  

posted @ 2017-07-31 14:03  zmlgo  阅读(157)  评论(0编辑  收藏  举报