LeetCode 0655. 输出二叉树

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0655. 输出二叉树相关的知识,希望对你有一定的参考价值。

【LetMeFly】655.输出二叉树

力扣题目链接:https://leetcode.cn/problems/print-binary-tree/

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

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

示例 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] 中。

方法一:DFS统计高度 + BFS填充矩阵

其实我觉得这道题的配图不是很好,样例二应该是这样的:

                  1
       +----------+-----------+
       2                      3
       +---+
           4

也就是说,越靠近根部,二叉树的“开口”就越大,4不在1的正下方。

但是这些都无所谓,只需要按照题意进行赋值就好了。

首先统计二叉树的高度。

int getTreeHeight(TreeNode* root) 
    if (!root)
        return 0;
    return 1 + max(getTreeHeight(root->left), getTreeHeight(root->right));

注意,题目中二叉树的根节点是0层,因此这个函数统计出来的 h e i g h t height height其实是题目中的 h e i g h t + 1 height + 1 height+1

因此,矩阵的大小为 h e i g h t × 2 h e i g h t − 1 height\\times 2^height - 1 height×2height1

vector<vector<string>> ans(height, vector<string>((1 << height) - 1));

之后我们可以建立一个结构体

struct Node 
    TreeNode* treeNode;  // 当前节点
    int x, y;  // 当前节点在矩阵中的位置
    Node(TreeNode* treeNode, int x, int y) : treeNode(treeNode), x(x), y(y) 
        
    
;

再建立一个队列,将根节点及其在矩阵中的位置入队。

在队列不空时,不断取出元素并在矩阵对应的位置赋值,如果左子或右子不为空,就入队。

左右子的位置计算公式题目中也已给出。

  • 时间复杂度 O ( h × 2 h ) O(h\\times 2^h) O(h×2h),其中 h h h是二叉的高度
  • 空间复杂度 O ( C ) O(C) O(C),其中 C C C是二叉树单层的最大节点数量

AC代码

C++

struct Node 
    TreeNode* treeNode;
    int x, y;
    Node(TreeNode* treeNode, int x, int y) : treeNode(treeNode), x(x), y(y) 
        
    
;

class Solution 
private:
    int getTreeHeight(TreeNode* root) 
        if (!root)
            return 0;
        return 1 + max(getTreeHeight(root->left), getTreeHeight(root->right));
    
public:
    vector<vector<string>> printTree(TreeNode* root) 
        int height = getTreeHeight(root);  // 这里的height就是题目中的height + 1
        vector<vector<string>> ans(height, vector<string>((1 << height) - 1));
        queue<Node> q;
        q.push(root, 0, ((1 << height) - 1) / 2);
        while (q.size()) 
            auto[node, x, y] = q.front();
            q.pop();
            ans[x][y] = to_string(node->val);
            if (node->left) 
                q.push(node->left, x + 1, y - (1 << (height - x - 2)));
            
            if (node->right) 
                q.push(node->right, x + 1, y + (1 << (height - x - 2)));
            
        
        return ans;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126461060

以上是关于LeetCode 0655. 输出二叉树的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 655.输出二叉树

Leetcode: 验证二叉树

[LeetCode]124. 二叉树中的最大路径和

(leetcode) 2458. 移除子树后的二叉树高度

(leetcode) 2458. 移除子树后的二叉树高度

(leetcode) 2458. 移除子树后的二叉树高度