实现
根据前边给出的定义,可以使用下边的一些函数来创建和操作二叉树。
(1)BinaryTree()创建仅有根节点的二叉树;
(2)insertLeftChild()将新节点插入树中作为其直接的左子节点;
(3)insertRightChild()将新节点插入树中作为其直接的右子节点;
(4)setRootVal(val)在当前节点中存储参数val中的对象;
(5)getRootVal()返回当前节点中存储的对象;
(6)insertLeft(val)新建一颗二叉树,并将其作为当前节点的左子节点;
(7)insertRight(val)新建一颗二叉树,并将其作为当前节点的左子节点。
实现树的关键在于选择一个好的内部存储技巧。Python提供了两种有意思的方式,我们在选择前会仔细了解这两种方式,第一种为“列表之列表”,第二种为“节点与引用”。
0 2列表之列表
用列表之列表表示数时,先从Python的列表数据结构开始,编写前边定义的函数。尽管为列表编写一套操作的接口与已经实现的其他抽象数据类型有些不同,但做起来还是很有意思的,因为这给我们提供了一个简单的数据类型。树由具有3个元素的列表实现:第1个元素是根节点的值;第2个元素是代表左子树的列表;第3个元素是代表右子树的列表。下图展示了一棵简单的树及其对应的列表实现,右侧是一颗简单的树,左侧是对应列表的实现。
注意,可以通过标准的列表切片操作访问子树。树的根是myTree[0],左子树是myTree[1],右子树是myTree[2]。下面展示了如何使用列表创建树,一旦创建完成就可以访问它的根节点、左子树和右子树。
列表之列表的优点在于子树的结构与树相同,是一种递归数据结构,很容易扩展到多叉树,仅需要增加列表元素就可以了。
接着提供一些便于将列表作为数使用的函数,以正式定义树的数据结构,我们不是要定义二叉树类,而是创建可用于标准列表的函数。
列表函数BinaryTree:
插入左子树:
插入右子树:
树的访问函数:
举例:
节点与引用
树的第二种表示法是利用节点与应用。我们将定义一个类,其中有根节点和左右子树的属性。每个节点保存根节点的数据项,以及指向左右子树的链接。
定义一个BinaryTree类,成员key保存根节点数据项,成员1eft/rightChild则保存指向左/右子树的引用(同样是BinaryTree对象)。
BinaryTree类:
![1f98116ac1e2d9be98e924adf706c487.png](https://i-blog.csdnimg.cn/blog_migrate/8a099e5cf6a1a39a48d4524fe7b8a612.png)
插入左子节点:
![ddfae8f072d83bcd47ab0e15dddbc776.png](https://i-blog.csdnimg.cn/blog_migrate/8f724ddb6db92b7e45c19f0f1941d8df.png)
插入右子节点:
![bf55891c3579491842c7172c48910003.png](https://i-blog.csdnimg.cn/blog_migrate/5fda850e567edc036302b73f53d29ad7.png)
二叉树的访问函数:
举例: