携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
也是暑假自学python的第13天
今天学习二叉树相关的学习
二叉树
二叉树是每个节点最多有两个树的树形结构,二叉树常常被用于实现二叉查找树和二叉堆,二叉树的每个节点最多只有两棵子树,二叉树的子树有左右之分。
二叉树的性质: 1.二叉树的第i层最多有2^(i-1)个节点 2.深度为k的二叉树最多有2^k-1个节点 3.完全二叉树特点:最后一层有空节点并且空缺在右边...
代码学习二叉树:
class Node(object):
# 节点类
def __init__(self, elem=-1, lchild=None, rchild=None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
# 建树
class Tree:
def __init__(self):
self.root = None
self.queue = []
def build_tree(self, element):
new_node = Node(element)
# 新元素放入队列中
self.queue.append(new_node)
# 新元素放入树中
if self.root is None:
self.root = new_node
else:
if self.queue[0].lchild is None:
self.queue[0].lchild = new_node
elif self.queue[0].rchild is None:
self.queue[0].rchild = new_node
self.queue.pop(0) # 全满则弹出这个节点
def preorder(self, node):
if node:
print(node.elem, end='')
self.preorder(node.rchild)
self.preorder(node.lchild)
def midorder(self, node):
if node:
self.midorder(node.lchild)
print(node.elem, end='')
self.preorder(node.lchild)
def lastorder(self, node):
if node:
self.lastorder(node.lchild)
self.lastorder(node.rchild)
print(node.elem, end='')
if __name__ == '__main__':
tree = Tree()
for i in 'abcdefghijhi':
tree.build_tree(i)
tree.preorder(tree.root)
print()
tree.midorder(tree.root)
print()
tree.lastorder(tree.root)
print()
代码浅析:
首先建立class Node用来建立树的节点,树的节点初始赋值为-1,创建左右结点。
建树的过程中,我们首先建立一个队列,这个队列用来确定在树的插入过程中节点的顺序,每当确定完插入的右子树以及为满的时候就将这个节点pop。
最后就是写三个遍历方法。
在main函数的使用过程中,实例化一个对象tree,导入的根节点就是tree.node。
在写遍历的方法过程中,python想要递归调用的话,需要self.order来进行调用,而不能直接order()。
时间复杂度
O(n)用来表示时间复杂度,对于算法来说时间复杂度非常重要。
O(1)<log2n<n^1/2<O(n)<nlog2n<n^2<2^n<n!
明天开始学习排序算法!
================================================================