牛客题霸 [输出二叉树的右视图] C++题解/答案
题目描述
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
题解;
分两个过程:
先用前序遍历+中序遍历恢复二叉树,这个应该都会。。
打印二叉树的后视图,其实就是层序遍历中每一层的最后一个元素
代码;
我的代码不知为何错了,,调不出来了。。
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* 求二叉树的右视图* @param xianxu int整型vector 先序遍历* @param zhongxu int整型vector 中序遍历* @return int整型vector*/vector<int>res;vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {// write code hereTreeNode* t=rebulid(xianxu,zhongxu,0,0,zhongxu.size()-1);right(t);return res;}TreeNode* rebulid(vector<int> &pre,vector<int> &in,int root,int l,int r){if(l>r)return NULL;TreeNode* tree=new TreeNode(pre[root]);int mid=l;while(mid<r&&pre[root]!=in[mid])mid++;tree->left=rebulid(pre, in, root+1, l, mid);tree->right=rebulid(pre,in,root+1+mid-l,mid+1,r);return tree;}void right(TreeNode *root){queue<TreeNode*>q;if(!root)return ;q.push(root);while(!q.empty()){int size=q.size();res.push_back(q.front()->val);while(size--){TreeNode* node=q.front();q.pop();if(node->right)q.push(node->right);if(node->left)q.push(node->right);}}}
};
借鉴的某大佬代码:
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* 求二叉树的右视图* @param xianxu int整型vector 先序遍历* @param zhongxu int整型vector 中序遍历* @return int整型vector*/TreeNode* mytree(vector<int> x,vector<int> z){if(x.size()==0||z.size()==0)return nullptr;TreeNode* root=new TreeNode(x[0]);int t=distance(z.begin(),find(z.begin(),z.end(),x[0]));vector<int> xleft(x.begin()+1,x.begin()+t+1);vector<int> xright(x.begin()+t+1,x.end());vector<int> zleft(z.begin(),z.begin()+t);vector<int> zright(z.begin()+t+1,z.end());root->left=mytree(xleft,zleft);root->right=mytree(xright,zright);return root;}vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {// write code hereTreeNode* root=mytree(xianxu,zhongxu);vector<int> res;queue<TreeNode*> que;if(root==nullptr) return res;que.push(root);while(!que.empty()){int len=que.size();for(int i=0;i<len;i++){TreeNode* t=que.front();que.pop();if(i==len-1)res.emplace_back(t->val);if(t->left) que.push(t->left);if(t->right) que.push(t->right);}}return res;}
};