分布操作,先统计depth,然后统计每个位置处的level值,然后再展开来得到最后的结果。
/**
* 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:
int gainDepth(TreeNode* root){
if(root==NULL)
return 0;
int leftdepth=0;
int rightdepth=0;
if(root->left!=NULL)
leftdepth = gainDepth(root->left);
if(root->right!=NULL)
rightdepth = gainDepth(root->right);
return leftdepth>rightdepth?1+leftdepth:1+rightdepth;
}
void func(int left, int right, int level, TreeNode* root,vector<string>& values, vector<int>& levels){
int mid=(left+right)/2;
values[mid]=to_string(root->val);
levels[mid]=level;
if(root->left!=NULL)
func(left,mid-1,level+1,root->left, values, levels);
if(root->right!=NULL)
func(mid+1,right,level+1,root->right, values, levels);
}
vector<vector<string>> printTree(TreeNode* root) {
int depth = gainDepth(root);
int width = pow(2, depth)-1; //result width
vector<string> values(width, "");
vector<int> levels(width, 0);
int left=0;
int right=width-1;
int level=0;
func(left,right,level, root,values, levels);
/*
for(int i=0;i<values.size();i++)
cout<<values[i]<<" ";
cout<<endl;
for(int i=0;i<levels.size();i++)
cout<<levels[i]<<" ";
*/
// gain result
vector<vector<string>> result;
for(int j=0;j<depth;j++){
vector<string> temp(width, "");
for(int i=0;i<levels.size();i++)//search 0
{
if(levels[i]==j)
temp[i]=values[i];
}
result.push_back(temp);
}
return result;
}
};