919. Complete Binary Tree Inserter(完全二叉树插入器)

题目描述

对这种题没有任何的抵抗力,只能乖乖地看Solution
完全二叉树是每一层(除最后一层外)都是完全填充(即,结点数达到最大)的,并且所有的结点都尽可能地集中在左侧。

设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作:
CBTInserter(TreeNode root) 使用头结点为 root 的给定树初始化该数据结构;
CBTInserter.insert(int v) 将 TreeNode 插入到存在值为 node.val = v 的树中以使其保持完全二叉树的状态,并返回插入的 TreeNode 的父结点的值;
CBTInserter.get_root() 将返回树的头结点。
在这里插入图片描述

方法思路

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class CBTInserter {
    TreeNode root;
    Deque<TreeNode> deque;
    public CBTInserter(TreeNode root) {
        this.root = root;
        deque = new LinkedList();
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(root);

        // BFS to populate deque
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (node.left == null || node.right == null)
                deque.offerLast(node);
            if (node.left != null)
                queue.offer(node.left);
            if (node.right != null)
                queue.offer(node.right);
        }
    }

    public int insert(int v) {
        TreeNode node = deque.peekFirst();
        deque.offerLast(new TreeNode(v));
        if (node.left == null)
            node.left = deque.peekLast();
        else {
            node.right = deque.peekLast();
            deque.pollFirst();
        }

        return node.val;
    }

    public TreeNode get_root() {
        return root;
    }
}
/**
 * Your CBTInserter object will be instantiated and called as such:
 * CBTInserter obj = new CBTInserter(root);
 * int param_1 = obj.insert(v);
 * TreeNode param_2 = obj.get_root();
 */
为了创建一个简单的二叉树结构,我们可以定义两个类:`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来绘制一个静态的二维视图,实际上,动态更新和交互可能需要更复杂的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值