当前位置: 首页 > 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)

效果

相关文章:

  • 【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?
  • 国家林草局原党组成员、副局长李春良接受审查调查
  • 网信部门曝光网络谣言典型案例,“AI预测彩票号码百分百中奖”等在列
  • 山东枣庄同一站点两名饿了么骑手先后猝死,当地热线:职能部门正调查
  • 国际博物馆日中国主会场确定,北京将展“看·见殷商”等展览
  • 欧阳娜娜携家人回江西探亲,受聘为江西吉安文化旅游大使
  • “不为一时一事所惑,不为风高浪急所扰”——习近平主席对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典纪实