ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 655. 输出二叉树

2021-07-27 17:34:54  阅读:124  来源: 互联网

标签:输出 arr TreeNode String val int 655 二叉树 leetcode


在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:

行数 m 应当等于给定二叉树的高度。
列数 n 应当总是奇数。
根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,但仍需要为另一个子树留出足够的空间。然而,如果两个子树都为空则不需要为它们留出任何空间。
每个未使用的空间应包含一个空的字符串""。
使用相同的规则输出子树。
示例 1:

输入:
1
/
2
输出:
[["", "1", ""],
["2", "", ""]]
示例 2:

输入:
1
/ \
2 3
\
4
输出:
[["", "", "", "1", "", "", ""],
["", "2", "", "", "", "3", ""],
["", "", "4", "", "", "", ""]]
示例 3:

输入:
1
/ \
2 5
/
3
/
4
输出:
[["", "", "", "", "", "", "", "1", "", "", "", "", "", "", ""]
["", "", "", "2", "", "", "", "", "", "", "", "5", "", "", ""]
["", "3", "", "", "", "", "", "", "", "", "", "", "", "", ""]
["4", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]]
注意: 二叉树的高度在范围 [1, 10] 中。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1:先遍历一次树,获取其最大深度d。
2:所以可以创建一个二维数组arr来记录来记录各个节点。根据树的性质,二维数组的参数为arr[d][(2 << (d - 1)) - 1]用 arr[m][n]。
3:再次遍历树,其根节点的横坐标为n 的中点。
4:之后,前序遍历,子节点和父节点的横坐标的距离为m == 1 ? 1 : (2 << (m - 2))。
5:最后,二维数组转换为list。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<String>> printTree(TreeNode root) {
        int d = findD(root);
        int length = (2 << (d - 1)) - 1;
        List<List<String>> all = new ArrayList<>(d);
        String[][] arr = new String[d][length];
        find(root, arr, d - 1, (d == 1 ? 1 : 2 << (d - 2)) - 1);
        for (int i = 0; i < d; i++) {
            List<String> list = new ArrayList<>(length);
            all.add(list);
            String[] strs = arr[d - i - 1];
            for (int j = 0; j < length; j++) {
                list.add(strs[j] == null ? "" : strs[j]);
            }
        }
        return all;
    }

    private void find(TreeNode node, String[][] arr, int m, int n) {
        if (node == null) {
            return;
        }
        arr[m][n] = String.valueOf(node.val);
        int item  = m == 1 ? 1 :(2 << (m - 2));
        find(node.left, arr, m - 1, n - item);
        find(node.right, arr, m - 1, n + item);
    }

    private int findD(TreeNode node) {
        if (node == null) {
            return 0;
        }
        return Math.max(findD(node.left), findD(node.right)) + 1;
    }
}

 

标签:输出,arr,TreeNode,String,val,int,655,二叉树,leetcode
来源: https://www.cnblogs.com/wangzaiguli/p/15067065.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有