美文网首页
解析数组存储二叉树2(优化版)

解析数组存储二叉树2(优化版)

作者: dwq1666666 | 来源:发表于2019-12-25 16:21 被阅读0次
# 这样实现逻辑上比较好理解一点,但是确实浪费了一些存储空间


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(优化版)

  • 常用数据结构

    一、序列 数组:顺序存储,随机访问 链表:链表存储,顺序访问 栈 队列 串 二、树 1)二叉树 2)遍历二叉树 前...

  • 【我是一棵树】二叉树详解(二)

    二叉树的存储结构 顺序存储:就是用一组数组来存储二叉树中节点,并且节点的存储位置,也就是数组的下标要能体现节点之间...

  • 四、树与二叉树

    四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...

  • 数据结构

    存储方式 1.连续性存储:数组 2.非连续性存储:链表、二叉树 栈的底层实现:LinkedList 、Array堆...

  • 顺序存储二叉树

    Overview 顺序存储二叉树,是由数组转换成的二叉树,一个元素为数组的二叉树。 提供了数组转换成二叉树的思路 ...

  • 堆排序

    预备知识 线性存储二叉树,即用数组来存储树(广度遍历存储) 根节点为i,则左节点arr[2i+1],右节点arr[...

  • 二叉树的存储及遍历

    一、二叉树顺序存储实现: 1.存储结构:(数组)···/* 0号单元存储根结点 */typedef CElemT...

  • 数据结构与算法的目录整理

    Ⅰ. 线性表 Ⅰ.1. 顺序存储结构之数组 Ⅰ.2. 链式存储之链表 Ⅱ. 树 Ⅱ.1. 树和二叉树的应用之赫夫曼...

  • 二叉树算法练习

    二叉树算法题练习。1.为什么使用二叉树? 数组存储方式1)优点:可以通过下标进行访问2)缺点:检索某个值,或者插入...

网友评论

      本文标题:解析数组存储二叉树2(优化版)

      本文链接:https://www.haomeiwen.com/subject/fwicoctx.html