当前位置: 首页 > news >正文

写了一个二叉树构造函数和画图函数,方便debug

代码 

class TreeNode(object):
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def construct_tree(nodes):
    if not nodes:
        return None

    root = TreeNode(nodes[0])
    queue = [root]
    index = 1

    while index < len(nodes):
        node = queue.pop(0)

        if nodes[index] is not None:
            node.left = TreeNode(nodes[index])
            queue.append(node.left)
        index += 1

        if index < len(nodes) and nodes[index] is not None:
            node.right = TreeNode(nodes[index])
            queue.append(node.right)
        index += 1

    return root



import matplotlib.pyplot as plt

def draw_tree(root):
    if not root:
        return

    # 获取树的高度
    def get_height(node):
        if not node:
            return 0
        return 1 + max(get_height(node.left), get_height(node.right))

    height = get_height(root)
    node_count = 2 ** height - 1
    node_positions = {}

    # 使用层序遍历确定每个节点的位置
    queue = deque([(root, 0, 0)])  # (节点, 层级, 水平位置)
    while queue:
        node, level, x = queue.popleft()
        y = height - level - 1  # 从底部开始绘制
        node_positions[node] = (x, y)

        if node.left:
            queue.append((node.left, level + 1, x - 2 ** (height - level - 2)))
        if node.right:
            queue.append((node.right, level + 1, x + 2 ** (height - level - 2)))

    # 绘制节点和连接线
    fig, ax = plt.subplots(figsize=(10, 10))
    ax.set_xlim(-node_count, node_count)
    ax.set_ylim(-1, height)
    ax.axis('off')

    for node, (x, y) in node_positions.items():
        # 绘制节点
        ax.text(x, y, str(node.val), ha='center', va='center',
                bbox=dict(facecolor='white', edgecolor='black', boxstyle='circle'))

        # 绘制连接线
        if node.left and node.left in node_positions:
            x1, y1 = node_positions[node.left]
            ax.plot([x, x1], [y, y1], 'black')
        if node.right and node.right in node_positions:
            x1, y1 = node_positions[node.right]
            ax.plot([x, x1], [y, y1], 'black')

    plt.show()

# 按装订区域中的绿色按钮以运行脚本。
if __name__ == '__main__':
    print_hi('PyCharm')
    solution = Solution()
    nodes = [3,9,20,None,None,15,7,8,6,8,5,4,6,1,2]
    root = construct_tree(nodes)
    draw_tree(root)

效果

http://www.dtcms.com/a/64611.html

相关文章:

  • 【HTML】一、基础标签
  • ETL与ELT核心技术解析:如何选择最优数据集成方案
  • SelectDB 实时分析性能突出,宝舵成本锐减与性能显著提升的双赢之旅
  • 使用纯CSS 实现 侧边栏 拖拽效果
  • 【15】单片机编程核心技巧:逻辑运算与位操作实战
  • Android UI 组件系列(二):Button 使用详解与常见属性
  • 全链条自研可控|江波龙汽车存储“双轮驱动”体系亮相MemoryS 2025
  • Pytesseract识别图片
  • 12 DHCP的内容和HTTP的改良
  • LeetCode27移除元素
  • Android12 使用自定义签名key替换系统默认testkey
  • 上下分层、左右分离的驱动设计思想
  • PMP–知识卡片--情商组成部分
  • java 手搓一个http工具类请求传body
  • Three.js中BufferGeometry 和 BoxGeometry
  • 网络变压器的主要电性参数与测试方法(4)
  • Jetpack Navigation 实战:Fragment 和 Activity 的交互与导航
  • Android Glide 缓存模块源码深度解析
  • SpringBoot缓存抽象:@Cacheable与缓存管理器配置
  • Vite项目中vite.config.js中为什么只能使用process.env,无法使用import.meta.env?
  • SpringCloud Alibaba——入门简介
  • 利用ArcGIS Pro进行爆炸波及建筑分析:详细步骤与技巧
  • 鸿蒙模拟器运行NDK项目失败 9568347
  • 【ai塔罗牌-生命之树】【azure openai】【python】交互塔罗牌demo
  • 【大模型系列】llama.cpp本地运行大模型
  • [排序算法]直接插入排序
  • 数据采集技术之python网络爬虫(中国天气网的爬取)
  • 动态规划(1. 第 N 个泰波那契数)
  • 【prompt实战】知乎问题解答专家
  • Mac java全栈开发环境配置