623. Add One Row to Tree(在二叉树中增加一行)

博客包含题目描述和方法思路两部分内容,虽未给出具体信息,但明确了核心要点。

题目描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

方法思路

class Solution {
    //Runtime: 4 ms, faster than 93.26%
    //Memory Usage: 40.1 MB, less than 59.02%
    public TreeNode addOneRow(TreeNode root, int v, int d) {
        if(d == 1){
            TreeNode node = new TreeNode(v);
            node.left = root;
            return node;
        }
        if(d == 2) add_Helper(root, v);
        else if(root != null) {
            if(root.left != null)
            addOneRow(root.left, v, d - 1);
            if(root.right != null)
            addOneRow(root.right, v, d - 1);
        }
        return root;
    }
    public void add_Helper(TreeNode root, int v){
        if(root == null) return;
        TreeNode left = root.left;
        TreeNode right = root.right;
        root.left = new TreeNode(v);
        root.right = new TreeNode(v);
        root.left.left = left;
        root.right.right = right;
    }
}
要将 Java 的 `int` 数组在控制台按树形输出,可先把数组转换为二叉树,再对二叉树进行打印。以下是实现代码: ```java import java.util.ArrayList; import java.util.List; class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class BinaryTreePrinter { // 从数组构建二叉树 public static TreeNode buildTree(int[] nums) { if (nums.length == 0) return null; TreeNode[] nodes = new TreeNode[nums.length]; for (int i = 0; i < nums.length; i++) { if (nums[i] != -1) { nodes[i] = new TreeNode(nums[i]); } } for (int i = 0; i < nums.length / 2; i++) { if (nodes[i] != null) { if (2 * i + 1 < nums.length) { nodes[i].left = nodes[2 * i + 1]; } if (2 * i + 2 < nums.length) { nodes[i].right = nodes[2 * i + 2]; } } } return nodes[0]; } // 计算二叉树的高度 public static int height(TreeNode root) { if (root == null) return 0; return Math.max(height(root.left), height(root.right)) + 1; } // 打印二叉树 public static void printTree(TreeNode root) { int h = height(root); int width = (int) Math.pow(2, h) - 1; List<List<String>> result = new ArrayList<>(); for (int i = 0; i < h; i++) { List<String> row = new ArrayList<>(); for (int j = 0; j < width; j++) { row.add(" "); } result.add(row); } fill(result, root, 0, 0, width - 1); for (List<String> row : result) { for (String s : row) { System.out.print(s); } System.out.println(); } } // 填充二叉树到二维列表 public static void fill(List<List<String>> result, TreeNode root, int row, int left, int right) { if (root == null) return; int mid = (left + right) / 2; result.get(row).set(mid, String.valueOf(root.val)); fill(result, root.left, row + 1, left, mid - 1); fill(result, root.right, row + 1, mid + 1, right); } public static void main(String[] args) { int[] nums = {1, 2, 3, 4, 5, 6, 7}; TreeNode root = buildTree(nums); printTree(root); } } ``` ### 代码解释 1. **TreeNode 类**:定义了二叉树的节点结构,包含节点的值以及左右子节点的引用。 2. **buildTree 方法**:从数组构建二叉树,数组中的 -1 表示空节点。 3. **height 方法**:计算二叉树的高度。 4. **printTree 方法**:创建一个二维列表来存储二叉树的输出,并调用 `fill` 方法填充该列表,最后打印该列表。 5. **fill 方法**:递归地将二叉树的节点值填充到二维列表中。 6. **main 方法**:示例代码,创建一个数组并构建二叉树,最后打印该二叉树
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值