题解 | #输出二叉树的右视图#
输出二叉树的右视图
http://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0
在重建树的同时进行右视图填充
1.重建树的过程就是根据先序结果找到子树根节点,根据中序结果划分左右子树;以此递归;
2.右视图即每一层最右边的节点(每层只有一个节点会入结果集),我们只需在重建树的过程中用一个变量n表示当前层数(从1开始),并以先右后左的顺序进行递归;那么当目前右视图结果集中元素数量小于当前层数时,就把当前节点值写入结果集。
class Solution { public: vector<int> ans; //left1表示先序遍历找到的当前根节点;left2与righ2为中序遍历中当前子树区间; //n为当前遍历的层数(第i层,从1开始) void dfs(vector<int>& xianxu, vector<int>& zhongxu,int left1,int left2,int right2,int n) { if(left2==right2) return; if(ans.size()<n) //结果集中元素数少于层数,说明此时该层还未压入节点 ans.emplace_back(xianxu[left1]); int newleft1=0; for(int i=left2;i<right2;++i) { if(zhongxu[i]==xianxu[left1]) { newleft1=i; break; } } //先右后左递归,保证每次入结果集的为最右侧的节点 dfs(xianxu,zhongxu,left1+newleft1-left2+1,newleft1+1,right2,n+1); dfs(xianxu,zhongxu,left1+1,left2,newleft1,n+1); } vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) { dfs(xianxu,zhongxu,0,0,xianxu.size(),1); return ans; } };