• LeetCode算法日记:655. 输出二叉树


    655. 输出二叉树

    日期:2022/8/22

    题目描述:给你一棵二叉树的根节点 root ,请你构造一个下标从 0 开始、大小为 m x n 的字符串矩阵 res ,用以表示树的 格式化布局 。构造此格式化布局矩阵需要遵循以下规则:

    树的 高度 为 height ,矩阵的行数 m 应该等于 height + 1 。
    矩阵的列数 n 应该等于 2height+1 - 1 。
    根节点 需要放置在 顶行 的 正中间 ,对应位置为 res[0][(n-1)/2] 。
    对于放置在矩阵中的每个节点,设对应位置为 res[r][c] ,将其左子节点放置在 res[r+1][c-2height-r-1] ,右子节点放置在 res[r+1][c+2height-r-1] 。
    继续这一过程,直到树中的所有节点都妥善放置。
    任意空单元格都应该包含空字符串 “” 。
    返回构造得到的矩阵 res 。

    示例:

    输入:root = [1,2]
    输出:
    [["","1",""],
     ["2","",""]]
     
     输入:root = [1,2,3,null,4]
    输出:
    [["","","","1","","",""],
     ["","2","","","","3",""],
     ["","","4","","","",""]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    思路:

    先dfs计算二叉树深度
    再用dfs往指定位置存放元素
    
    • 1
    • 2

    代码+解析:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
    class Solution {
    public:
        int getHeight(TreeNode* root){
            int h=0; 
            if(root->left){
                h = max(h, getHeight(root->left)+1);
            }
            if(root->right){
                h = max(h, getHeight(root->right)+1);
            }
            return h;
        }
        
        void dfs(vector>& res, TreeNode*  root, int r, int c,const int& height){
            res[r][c] = to_string(root->val);
            if(root->left){
                dfs(res, root->left, r+1, c - (1 << (height-r-1)),height);
            }
            if(root->right){
                dfs(res, root->right, r+1, c + (1 << (height-r-1)),height);
            }
            
        }
    
        vector> printTree(TreeNode* root) {
            int height = getHeight(root);
            int m = height+1;
            int n = (1 << (height+1)) - 1;
            vector> res(m, vector(n,""));
            dfs(res, root, 0, (n-1)/2, height);
    
            return res;
        }
    
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    学到的总结:

    1. 移位运算
      • << 左移:相当于乘2,左移n位相当于乘以2的n次方。1 << (height-r-1) == 1 * 2^(height-r-1)
      • >> 右移:相当于除2,右移n位相当于除以2的n次方
    2. 用if(root->left)代替if(root->nullptr) return。 一直有个bug,说移位的指数为负,后来才知道是因为我用的if(root->null)return
  • 相关阅读:
    背完这套 Java 面试八股文,自动解锁面试牛逼症被动技能
    I2C协议
    语音信号处理(二): 发声生理、听觉生理与听觉心理
    pyhton如何判断字符串中是否只含有数字——isnumeric/isdigit/isdecimal三大函数的区别及实例
    华为eNSP实验-三层交换机的不同网段通信(通过OSPF路由方式)
    UnboundLocalError: local variable ‘x‘ referenced before assignment 分析
    Js使用ffmpeg进行视频剪辑和画面截取
    解决MySQL8.0本地计算机上的MySQL服务启动后停止没有报告任何错误
    测试用例:在线音乐播放器
    lua基础之table
  • 原文地址:https://blog.csdn.net/happykoi/article/details/126464975