基本数据结构:树
什么是树
树的实现
树的实现主要有两种方式:列表之列表
和节点之引用
文章使用节点之引用
实现。
-
BinaryTree()
创建一个二叉树 -
getLeft()
返回当前节点的左子节点所对应的树 -
getRight()
返回当前节点的右子节点所对应的树 -
setVal(val)
在当前节点中存储val -
insertLeft(val)
新建一颗二叉树,并将其作为当前节点的左子节点 -
insertRight(val)
新建一颗二叉树,并将其作为当前节点的右子节点
首先定义一个简单的类。
1
2
3
4
5class BinaryTree:
def __init__(self,val=None):
self.val = val
self.left = None
self.right = None节点之引用
的要点是,属性left
和right
会指向BinaryTree类的其他实例。也就是说,向树中插入新的左子树,我们会创建另一个BinaryTree
实例,并将根节点的self.left
指向新树。下面是插入左子节点。
1
2
3
4
5
6
7
8
9# 插入左子节点
def insertLeft(self,newNode):
if self.left == None:
self.left = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.left = self.left
self.left = t 在插入左子树时,必须考虑两种情况,一种是原本没有左子节点。此时,只需在树种添加一个节点即可。第二种情况是已经存在左子节点。此时,插入一个节点,并将已有的左子节点降一层。
插入右子节点同理。
1
2
3
4
5
6
7
8# 插入右子节点
def insertRight(self,newNode):
if self.right == None:
self.right = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.right = self.right
self.right = t节点访问函数
1
2
3
4
5
6
7
8
9
10
11
12
13# 访问当前节点的左子树
def getLeft(self):
return self.left
# 访问当前节点的右子树
def getRight(self):
return self.right
# 设置当前的节点的值
def setVal(self,val):
self.val = val
# 获取当前节点的值
def getVal(self,val):
return self.val
遍历二叉树
前序遍历
1 | def pre_order(root): |
中序遍历
1 | def mid_order(root): |
后续遍历
1 | def post_order(root): |
将有序的整数数组转换成二叉树
二叉排序树
任意节点node: 如果有左孩子节点left,则left小于node
如果有右孩子节点right,则right的值大于node
按中序遍历,节点就是有序输出
例如:数组[1,2,3,4,5,6,7,8,9,10]
分析
6是中位数,分成1,2,3,4,5和7,8,9,10;1,2,3,4其中3是中位数,分为1,2和4,5;7,8,9,10分为7,8和10,继续递归….
1 | class BinaryTree: |
树的应用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 道坤!
评论