算法题41:输出二叉树的右视图
思路
建树+输出右视图
建树参考算法题40;
输出右视图即为说出每层的最后一个结点,可借助队列保存每层结点。
代码
//查找数值在数组中的位置
int Index(vector<int> vin, int num){
for(int i = 0; i < vin.size(); i++){
if(num == vin[i]) return i;
}
return -1;
}
int cur_id = -1;
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.empty()) return NULL; //处理完毕
TreeNode *root = new TreeNode(pre[0]); //创建结点
cur_id = Index(vin, pre[0]);//当前结点在vin中的位置
std::cout<<cur_id<<std::endl;
vector<int> pre_l;
vector<int> pre_r;
vector<int> vin_l;
vector<int> vin_r;
//vector取区间,是左闭右开的结构,右边参数需要+1
pre_l.assign(pre.begin() + 1, pre.begin() + cur_id + 1);
pre_r.assign(pre.begin() + cur_id + 1, pre.end());
vin_l.assign(vin.begin(), vin.begin() + cur_id);
vin_r.assign(vin.begin() + cur_id + 1, vin.end());
//左子树
root->left = reConstructBinaryTree(pre_l, vin_l);
//右子树
root->right = reConstructBinaryTree(pre_r, vin_r);
return root;
}
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
// write code here
//重建二叉树
TreeNode *root = reConstructBinaryTree(xianxu, zhongxu);
//输出右视图,借助队列输出每一层最后一个结点
vector<int> vec;
queue<TreeNode*> qu;
qu.push(root);
TreeNode *node;
while(!qu.empty()){
int size = qu.size();
while(size--){
node = qu.front();
if(node->left) qu.push(node->left);
if(node->right) qu.push(node->right);
qu.pop();
}
//将该层最后一个结点值加入数组
vec.push_back(node->val);
}
return vec;
}