树是 n个节点 (n>=0)的优先集合,当n=0,为空树:n>0时,为非空树,任意一棵非空树,满足一下两个条件;
(1)有且仅有一个称为根的节点
(2)除根节点以外,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合都是一棵树,并且称为根的子树。
节点包含数据元素以及若干指向子树的分支信息
A/ \
B C/ / \
F D E5个节点 A B C D E 共
节点拥有的子树个数
A/ \
B C/ / \
F D E1 C的度为2 B的度为
树中节点的最大度数
A/ \
B C/ / \
F D E2 故树的最大度数为2 节点中度最大的度数为
度为0的节点,又称叶子
A/ \
B C/ / \
F D E F D E都是终端节点,又称叶子节点
度大于0的节点,除了叶子都是分支节点
A/ \
B C/ / \
F D E A B C 都是分支节点
除了树根和叶子都是内部节点
A/ \
B C/ / \
F D E B C为内部节点
从根节点到该节点的层数
A/ \
B C/ / \
F D E1 B所在层数2 D所在层数3 A所在层数为
所有节点中最大的层数
A/ \
B C/ / \
F D E3,故树的深度或高度为3 最大层数为
树中两个节点之间经过的节点序列
A/ \
B C/ / \
F D E F 与 E的路径为 FBACE
两节点之间路径上经过的边数
A/ \
B C/ / \
F D E4 F 与 E的路径为 FBACE、路径长度为
从树根到每个节点的路径长度的总和
A/ \
B C/ / \
F D E:0 B:1 F:2 C:1 D:2 E:2
A=0+1+2+1+1+2+2=9 sum_length
节点的子树的根称为该节点的孩子,反之,该节点为其他孩子的双亲
A/ \
B C/ / \
F D E
B的双亲为A D的双亲为C C的孩子为D与E A的孩子为B与C
双亲相同的接待你互称兄弟
A/ \
B C/ / \
F D E B与C互为兄弟、D与E互为兄弟
双亲是兄弟的节点互称堂兄弟
A/ \
B C/ / \
F D E F与D、F与E互为堂兄弟
从该节点到树根经过的所有节点称为该节点的祖先
A/ \
B C/ / \
F D E
D的祖先有C A F的祖先有B A
节点的子树中的所有节点都称为该节点的子孙
A/ \
B C/ / \
F D E B C D E F都是A的子孙
节点的各子树从左到右有序,不能互换位置
A/ \
B C/ / \
F D E
节点各子树可以互换位置
子树位置互换
A A/ \ / \
B C C B/ / \ / \ /
F D E E E F
由m (m>=0) 棵不相交的树组成的集合
A A/ \ / \
B C C B/ / \ / \ /
...... F D E E E F
1、树中节点的数量等于所有结点度数+1,因为根节点上面没有边
2、度为m的树中第i层至多有m^(i-1)个节点(i>=1)
3、高度为h的m叉树至多有(m^h - 1)(m-1)个节点
4、具有n个节点的m叉树的最小高度为 取上界(log m (n(m-1)+1) )
双亲表示法
data parent0 A -1
1 B 0
2 C 0
3 F 1
4 D 2
5 E 2
#define MAX_TREE_SIZE 100
typedef struct{
;
ElementType dataint parent;
}PTNode;
typedef struct{
[MAX_TREE_SIZE];
PTNode nodesint n;//记录使用到哪里了
}PTree;
孩子表示法
data child child0 A 1 2
1 B 3 -1
2 C 4 5
3 F -1 -1
4 D -1 -1
5 E -1 -1
#define MAX_TREE_SIZE 100
#define CHILD_MAX_SIZE 2//树的度
typedef struct{
;
ElementType dataint child1;
int child2;
//或者使用数组形式
//int childs[CHILD_MAX_SIZE];
//int n;
}CTNode;
typedef struct{
[MAX_TREE_SIZE];
CTNode nodesint n;//记录使用到哪里了
}CTree;
双亲孩子表示法
data parent child child0 A -1 1 2
1 B 0 3 -1
2 C 0 4 5
3 F 1 -1 -1
4 D 2 -1 -1
5 E 2 -1 -1
#define MAX_TREE_SIZE 100
#define CHILD_MAX_SIZE 2
typedef struct{
;
ElementType dataint childs[CHILD_MAX_SIZE];
int n;
int parent;
}PCTNode;
typedef struct{
[MAX_TREE_SIZE];
PCTNode nodesint n;
}PCTree;
|first
data0 A| ----->1|----->2|^
1 B| ----->3|^
2 C| ----->4|----->5|^
3 F|^
4 D|^
5 E|^
#define MAX_TREE_SIZE 100
struct ChildNode{
int index;
*next;
ChildNode};
struct Node{
;
ElementType data*firstChild;
ChildNode};
[MAX_TREE_SIZE]; Node tree
如果在表头加一个双亲域parent,则为双亲孩子链表
#define MAX_TREE_SIZE 100
struct ChildNode{
int index;
*next;
ChildNodeint parent;
};
struct Node{
;
ElementType data*firstChild;
ChildNode};
[MAX_TREE_SIZE]; Node tree
又称二叉链表
struct Node{
*firstChild;//第一个孩子
Node*nextSibling;//右兄弟
Node;
ElementType data};
||A|^|
A 兄弟关系向右斜 / | \ /
||B||
B C D /\ / /\ / \
|^|E|| \
E F G H I
\ \ \|^|F|^| \
J ||C||
/ \
||G|^| ||D|^|
/ /
|^|J|^| |^|H||
\|^|I|^|