HOT655. 输出二叉树

655. 输出二叉树

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

/*
 * @lc app=leetcode.cn id=655 lang=javascript
 *
 * [655] 输出二叉树
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {string[][]}
 */
var printTree = function(root) {
     // 构造一个数组,即构造一个height * 2^height - 1的数组
     const height = getHeight(root);
     const len = Math.pow(2,height) - 1;
     let resArr = new Array(height);
     // 构造二维数组
     for(let i = 0;i<resArr.length;i++) {
         resArr[i] = new Array(len);
         resArr[i].fill("")
     }

    //  填充数字
    let i = 0;
    let l = 0;
    let r = len - 1;
    
    // resArr[i][(l + r) / 2] = root.val;
    fill(root, 0, l, r, resArr);
    return resArr;

};
// i:resArr数组的第i层
// l:左边界
// r:右边界
function fill(root, i , l, r, resArr) {
    if (!root) return;
  // 对于根节点来说,他的位置在中位数上
    resArr[i][(l + r)/2] = root.val + '';
    // 对于左子树来说,他的位置在以0为左边界,以根节点位置为右边界的中位数上
    fill(root.left,i+1, l,  (l + r)/2 - 1, resArr)
    fill(root.right,i+1,(l + r)/2 + 1 ,  r, resArr)
}

// 获取树的深度
function getHeight(root) {
    if (!root) return 0;

    return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
}
// @lc code=end


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。