主要记录:树和树的算法
内容来源:书籍、网络和个人总结
1. 理论
1.1 树的由来
1.2 树的三个属性
- 层次性,即树是按层级构建的,越笼统就越靠近顶部,越具体则越靠近底部。
- 一个节点的所有子节点与另一个节点的所有子节点无关。
- 叶子节点都是独一无二的。
1.3 术语
节点
节点是树的基础部分。它可以有自己的名字,我们称作“键”。节点也可以带有附加信息, 我们称作“有效载荷”。
边
边是树的另一个基础部分。两个节点通过一条边相连,表示它们之间存在关系。
路径
路径是由边连接的有序节点列表。
层数
节点 n 的层数是从根节点到 n 的唯一路径长度。(根节点的层数是0。)
高度
树的高度是其中节点层数的最大值。
其它:略
1.4 定义
版本一(节点和边)
树由节点及连接节点的边构成。树有以下属性:
- 有一个根节点;
- 除根节点外,其他每个节点都与其唯一的父节点相连;
- 从根节点到其他每个节点都有且仅有一条路径;
- 如果每个节点最多有两个子节点,我们就称这样的树为二叉树。
定义一示意图:
(由节点和边构成的树)
版本二(涉及递归)
一棵树要么为空,要么由一个根节点和零棵或多棵子树构成,子树本身也是一棵树。 每棵子树的根节点通过一条边连到父树的根节点。
定义二示意图:
(由递归定义的树)
2. 实现
实现树的关键在于选择一个好的内部存储技巧。Python 提供两种有意思的方式,第一种称作“列表之列表”,第二种称作“节点与引用”。
2.1 用列表实现树——“列表之列表”
在“列表之列表”的树 中,我们将根节点的值作为列表的第一个元素;第二个元素是代表左子树的列表;第三个元素是 代表右子树的列表。
图示
代码示例
myTree = ['a', #root
['b', #left subtree
['d', [], []],
['e', [], []] ],
['c', #right subtree
['f', [], []],
[] ]
]
优点
“列表之列表”表示法的优点:
- 子树的结构与树相同,是一种递归数据结构
- 很容易扩展到多叉树,仅需要增加列表元素即可(不局限于二叉树)
python 代码实现
通过定义一系列函数来辅助操作嵌套列表:
- BinaryTree创建仅有根节点的二叉树
- insertLeft/insertRight将新节点插入树中作
为其直接的左/右子节点 - get/setRootVal则取得或返回根节点
- getLeft/RightChild返回左/右子树
def BinaryTree(r): # 创建一个树
return [r, [], []]
# 插入操作是直接插入到根节点下面的左右子树,若已经存在,则替而代之并将其变为自己的子树
def insertLeft(root, newBranch):
t = root.pop