顺序存储二叉树是指用一个数组存储的二叉树,一般用于完全二叉树,物理上用数组存储逻辑上是一个树结构。
- 第n个元素的左节点索引2n+1
- 第n个元素的右节点索引2n+2
- 第n个元素的父节点为(n-1)/2
- n为元素在数组中的索引
class Node(object):
def __init__(self, data):
self.data = data
class ArrayBinaryTree(object):
"""
顺序存储二叉树是指用一个数组存储的二叉树,一般用于完全二叉树,物理上用数组存储逻辑上是一个树结构。
顺序存储二叉树 基于数组实现
左节点 2n+1
右节点 2n+2
父节点 (n-1)/2
"""
def __init__(self, nodes=[]):
self.nodes = nodes
def pre_order(self, index):
"""
前序遍历
:return:
"""
length = len(self.nodes)
if length <= 0 or index > length:
raise Exception("tree is empty or index out of range!")
print(self.nodes[index].data, end='->')
left_index = 2 * index + 1
if left_index < length and self.nodes[left_index] is not None:
self.pre_order(left_index)
right_index = 2 * index + 2
if right_index < length and self.nodes[right_index] is not None:
self.pre_order(right_index)
def in_order(self, index):
"""
中序遍历
:param index:
:return:
"""
length = len(self.nodes)
left_index = 2 * index + 1
if left_index < length and self.nodes[left_index] is not None:
self.in_order(left_index)
print(self.nodes[index].data, end='->')
right_index = 2 * index + 2
if right_index < length and self.nodes[right_index] is not None:
self.in_order(right_index)
def post_order(self, index):
"""
后序遍历
:param index:
:return:
"""
length = len(self.nodes)
left_index = 2 * index + 1
if left_index < length and self.nodes[left_index] is not None:
self.post_order(left_index)
right_index = 2 * index + 2
if right_index < length and self.nodes[right_index] is not None:
self.post_order(right_index)
print(self.nodes[index].data, end='->')
if __name__ == '__main__':
array_binary_tree = ArrayBinaryTree([Node(i) for i in range(1, 8)])
array_binary_tree.pre_order(0)
print()
array_binary_tree.in_order(0)
print()
array_binary_tree.post_order(0)