树的定义
树(tree):n(n>=0)个节点的有限集T。
n=0 则称为空树。
当n>0时,有且仅有一个特定的节点,称为树的根(root)。
当n>1时,其余节点可分为m(m>=0)个互不相交的有限集T1,T2,..Tm,其中每一个和本身又是一棵树,称为跟的子树(subtree)。
①
╱ │ ╲
② ④ ③
树与非树识别
除了根节点外,每个节点有且仅有一个父节点。
一个N个节点的树,共有N-1条边。
树的基本术语
结点(node)--表示树中的元素,包含数据元素及若干指向其子树的分支。
结点的度(degree)--结点拥有的子树数。
叶子(leaf)或终端结点--度为0的结点。
分支结点--度不为0的结点。
树的度--一棵树中最大的结点度数。
孩子(child)--结点子树的根称为该结点的孩子。
双亲(parents)--孩子结点的上层结点叫该结点的双亲。
兄弟(sibling)--同一双亲的孩子。
祖先结点--从根节点到该结点路径上所有结点。
子孙结点--一个结点的直接后继和间接后继。
结点的层次(level)--从根节点算起,根为第一层,它的孩子为第二层...
深度(depth)--树中节点的最大层次数。
A
╱ │ ╲
B C D
╱ ╲
E F
│
G
树型结构与线性结构
线性结构:
第一个数据元素(无前驱)
最后一个数据元素(无后继)
其他数据元素(一个前驱、一个后继)
树型结构(非线性结构):
根节点(无前驱)
多个叶子节点(无后继)
其他数据元素(一个前驱、多个后继)
如何表示树中元素间的关系?
A
╱ │ ╲
B C D
╱ ╲
E F
│
G
双亲表示法
data parent
0 A -1
1 B 0
2 C 0
3 D 0
4 E 2
5 F 2
6 G 5
树的存储结构-孩子表示法
孩子链表:每个节点的孩子结点用单链表存储,再用含n个元素的结构数组指向每个孩子链表。
A
╱ ╲
B C
╱ ╲ ╲
D E F
╱ │ ╲
G H I
data | fc | ||||||||
0 | |||||||||
1 | A | → | 2 | → | 3 | ^ | |||
2 | B | → | 4 | → | 5 | ^ | |||
3 | C | → | 6 | ^ | |||||
4 | D | ^ | |||||||
5 | E | → | 7 | → | 8 | → | 9 | ^ | |
6 | F | ^ | |||||||
7 | G | ^ | |||||||
8 | H | ^ | |||||||
9 | I | ^ |
带双亲的孩子链表
data | parent | fc | ||||||||
1 | A | 0 | → | 2 | → | 3 | ^ | |||
2 | B | 1 | → | 4 | → | 5 | ^ | |||
3 | C | 1 | → | 6 | ^ | |||||
4 | D | 2 | ^ | |||||||
5 | E | 2 | → | 7 | → | 8 | → | 9 | ^ | |
6 | F | 3 | ^ | |||||||
7 | G | 5 | ^ | |||||||
8 | H | 5 | ^ | |||||||
9 | I | 5 | ^ |
树的存储结构-孩子兄弟表示法
实现:设计统一的结点结构,每个节点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点。
^ A ^ 其中两个指针
特点:
操作容易
空间浪费少
A | ||||||||||||
↓ | B | → | ↓ | C | ^ | |||||||
^ | F | ^ | ||||||||||
^ | D | → | ↓ | E | ^ | |||||||
↓ | ||||||||||||
^ | G | → | ^ | H | → | ^ | I | ^ | ||||
typedef struct SCNode
{ ElemType data;
struct SCNode *firstchild, *nextsibling;
}CSNode,*CSTree;
向右旋转45º得到一棵树,二叉树。
每个节点至多只有二棵子树并且子树有左右之分,其次序不能任意颠倒的树称为二叉树。
原文地址:https://www.cnblogs.com/privilege/p/11184628.html