leetcode 654. maximum-binary-tree 最大二叉树 python3

本文介绍了一种构建最大二叉树的方法,通过递归寻找数组中的最大值作为根节点,并进一步构建左右子树。提供了完整的代码实现及示例。

时间:2021-1-25

题目地址:https://leetcode-cn.com/problems/maximum-binary-tree/

题目难度:Medium

题目描述:

给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:

二叉树的根是数组 nums 中的最大元素。
左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。
右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。
返回有给定数组 nums 构建的 最大二叉树 。

 

示例 1:


输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
    - [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
        - 空数组,无子节点。
        - [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
            - 空数组,无子节点。
            - 只有一个元素,所以子节点是一个值为 1 的节点。
    - [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
        - 只有一个元素,所以子节点是一个值为 0 的节点。
        - 空数组,无子节点。
示例 2:


输入:nums = [3,2,1]
输出:[3,null,2,null,1]


思路1:递归

一开始没毛病 想清楚了根节点要干啥 后来是绕哪里去了???

代码段1:通过

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
        if nums == []:
           return None
        max_index = nums.index(max(nums))
        root = TreeNode(max(nums))
        root.left = self.constructMaximumBinaryTree(nums[: max_index])
        root.right = self.constructMaximumBinaryTree(nums[max_index + 1:])
        return root

总结:

  1. 保持理智

待调试= =

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
        return self.build(nums, 0, len(nums) - 1)
    
    def build(self, nums: List[int], start: int, end: int) -> TreeNode:
        if start > end:
            return None
        index, max_val = -1, -99999999999
        for i in range(start, end):
            if nums[i] > max_val:
                index = i
                max_val = nums[i]
        node = TreeNode(val = max_val)
        node.left = self.build(nums, start, index - 1)
        node.right = self.build(nums, index + 1, end)
        return node

 

 

为了创建一个简单的二叉树结构,我们可以定义两个类:`TreeNode`(表示树中的单个节点)和 `BinaryTree`(代表整个二叉树)。这里我将给出基本的Java实现,并使用`java.util.ArrayList`来存储节点。 首先,我们定义`TreeNode`类: ```java public class TreeNode { int data; // 节点的数据 TreeNode left; // 左子节点 TreeNode right; // 右子节点 public TreeNode(int data) { this.data = data; left = null; right = null; } } ``` 接下来,我们定义`BinaryTree`类,包含根节点和其他辅助方法: ```java import java.util.ArrayList; public class BinaryTree { private TreeNode root; public BinaryTree() { root = null; } public void insert(int data) { root = insertNode(root, data); } private TreeNode insertNode(TreeNode node, int data) { if (node == null) { return new TreeNode(data); } if (data < node.data) { node.left = insertNode(node.left, data); } else if (data > node.data) { node.right = insertNode(node.right, data); } return node; } // 添加其他可能的方法,如遍历、删除等 // 以及可视化方法(如果使用图形界面,例如Swing或JavaFX) } ``` 对于可视化二叉树,通常会使用图形库如JUNG(Java Universal Network/Graph Framework)或JavaFX的Scene Graph。这里提供一个简化的可视化示例,但实际应用时可能需要更复杂的图形渲染: ```java import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public void visualize(TreeNode node, Pane pane) { if (node != null) { Rectangle rect = new Rectangle(30, 30); rect.setFill(Color.BLUE); // 设置节点颜色 rect.setTranslateX(node.data * 50); // 假设每个节点宽度为30px,根据数据值偏移位置 rect.setTranslateY(node.level * 50); // 根据深度设置y坐标,假设每一层的高度为50px pane.getChildren().add(rect); visualize(node.left, pane); visualize(node.right, pane); } } // 使用场景和舞台进行显示 public static void main(String[] args) { BinaryTree bt = new BinaryTree(); // 先插入节点... Stage stage = new Stage(); Pane rootPane = new Pane(); Scene scene = new Scene(rootPane, 800, 600); visualize(bt.root, rootPane); stage.setScene(scene); stage.show(); } ``` 这个例子使用了JavaFX来绘制一个静态的二维视图,实际上,动态更新和交互可能需要更复杂的方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值