前置题目:
NC12 重建二叉树
NC15 求二叉树的层序遍历
先根据前序和中序把二叉树重建出来,然后获取每一层的最右结点就可以了
class Solution {
public:
struct TreeNode{
int val;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
TreeNode* left;
TreeNode* right;
};
void Build(TreeNode* &root,vector<int> &pre,vector<int> &vin,int ps,int is,int len)
{
if(len == 0){root = NULL;return;}
int Root = pre[ps];
root = new TreeNode(Root);
int Lnum = 0;
int Rnum = 0;
for(int i = 0 ; i < len ; i++)
{
if(vin[is+i] != Root)
{
Lnum++;
}
else{
break;
}
}
Rnum = len-Lnum-1;
Build(root->left,pre,vin,ps+1,is,Lnum);
Build(root->right,pre,vin,ps+1+Lnum,is+1+Lnum,Rnum);
}
TreeNode* root = NULL;
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
// write code here
Build(root,xianxu,zhongxu,0,0,zhongxu.size());
vector<vector<int> > ans;
queue< pair<TreeNode*,int> > Q;
Q.push(pair<TreeNode*,int> (root,0));
while(!Q.empty())
{
TreeNode* now = Q.front().first;
int cur = Q.front().second;
Q.pop();
if(now == NULL){continue;}
vector<int> temp;
if(cur+1 >ans.size())
{
ans.push_back(temp);
}
ans[cur].push_back(now->val);
if(now->left != NULL){
Q.push(pair<TreeNode*,int>(now->left,cur+1));
}
if(now->right != NULL){
Q.push(pair<TreeNode*,int>(now->right,cur+1));
}
}
vector<int> Right;
for(int i = 0 ;i < ans.size() ; i ++)
{
Right.push_back(ans[i][ans[i].size()-1]);
}
return Right;
}
};
京公网安备 11010502036488号