• leetcode:655. 输出二叉树


    655. 输出二叉树

    在一个 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 
     / 
    输出:
    [["",  "",  "", "",  "", "", "", "1", "",  "",  "",  "",  "", "", ""]
     ["",  "",  "", "2", "", "", "", "",  "",  "",  "",  "5", "", "", ""]
     ["",  "3", "", "",  "", "", "", "",  "",  "",  "",  "",  "", "", ""]
     ["4", "",  "", "",  "", "", "", "",  "",  "",  "",  "",  "", "", ""]]
    注意: 二叉树的高度在范围 [1, 10] 中。
     

    思路:首先确定好二维数组的大小,那就要求树的高度,然后再查找数组中哪些值需要更改,查看案例发现,需要更改的值的位置都是在中心点的位置。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
    
        vector<vector<string>> printTree(TreeNode* root) {
        int i=getTreeHigh(root);    //i行
        int j=pow(2,i)-1;           //j列
        vector<vector<string>> res(i,vector<string>(j,""));    //初始化比for循环赋值要快
    
        dfs(res,root,0,0,j);
        return res;
        }
    
        void dfs(vector<vector<string>>& res,TreeNode* t,int depth,int left,int right){
            if(!t)return;
            int mid=left+right>>1;
            res[depth][mid]=to_string(t->val);      //所需要修改的值的下标类似于二分的中间数
                                                    //就是区间的中心点
            dfs(res,t->left,depth+1,left,mid);
            dfs(res,t->right,depth+1,mid,right);
        }
    
        int getTreeHigh(TreeNode* t){       //递归求树的高度
            if(!t)return 0;
            return max(getTreeHigh(t->left),getTreeHigh(t->right))+1;
        }
    };
    

      

  • 相关阅读:
    动态规划
    Python第二天学习
    Python第一天学习---基础语法
    java易错知识点
    C语言---指针复习
    排序汇总
    课程设计---创建族谱管理系统
    Vue第五篇 Vue的生命周期
    Vue第四篇 Vue路由系统
    Vue第三篇 Vue组件
  • 原文地址:https://www.cnblogs.com/52dxer/p/12539971.html
Copyright © 2020-2023  润新知