# 这样实现逻辑上比较好理解一点,但是确实浪费了一些存储空间
class Tree:
def __init__(self):
self.root = None
self.list_data = []
def print_tree(self, list_type=0): # 遍历输出这颗树
self.print_node(self.root, list_type)
def print_node(self, node, list_type):
if list_type == 0: # 前序遍历
if node.left is not None:
self.print_node(node.left, list_type)
print(node.data)
if node.right is not None:
self.print_node(node.right, list_type)
elif list_type == 1: # 前序遍历
print(node.data)
if node.left is not None:
self.print_node(node.left, list_type)
if node.right is not None:
self.print_node(node.right, list_type)
elif list_type == 2: # 后序遍历
if node.left is not None:
self.print_node(node.left, list_type)
if node.right is not None:
self.print_node(node.right, list_type)
print(node.data)
def insert(self, data):
if self.root is None:
self.root = Node(data)
return
current_node = self.root
while current_node is not Node:
if current_node.data == data: # 这个数据已经在里面则跳出
return
elif data > current_node.data: # 当前这个节点的值小于需要插入的值
if current_node.right is None: # 如果右节点为空插入这个节点数据
current_node.right = Node(data)
else: # 不为空的时候需要继续比较下一级
current_node = current_node.right
else: # 当前节点的数据大于需要插入的数据
if current_node.left is None:
current_node.left = Node(data)
else:
current_node = current_node.left
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
tree = Tree()
def set_tree(data, start, end, node=None):
# 操作获取到中间索引
if (start + end) % 2 == 1:
mid = (start + end) // 2 + 1
else:
mid = (start + end) // 2
new_node = Node(data[mid])
if tree.root is None:
tree.root = new_node
else:
if data[mid] > node.data:
node.right = new_node
elif data[mid] < node.data:
node.left = new_node
left_end = mid - 1
# 递归处理左子树
if left_end >= start:
set_tree(data, start, left_end, new_node)
right_start = mid + 1
# 递归处理右子树
if right_start <= end:
set_tree(data, right_start, end, new_node)
def get_data():
n = int(input())
return n, [int(input()) for i in range(n)]
def main():
n, data = get_data()
set_tree(data, 0, n-1)
# print('根节点', tree.root.data)
tree.print_tree(2)
if __name__ == '__main__':
main()
解析数组存储二叉树2(优化版)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 前面讲的都是线性表结构,栈、队列等等。今天讲一种非线性表结构,树。树这种数据结构比线性表的数据结构要复杂得多,内容...
- 二叉树基础(上):什么样的二叉树适合用数组存储? 极客时间原文链接 前面学习到的都是线性表结构,栈,队列等等。今天...