题目描述
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
解法
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型vector 先序遍历
* @param zhongxu int整型vector 中序遍历
* @return int整型vector
*/
//解法:二叉树重构+输出树的右视图
// 时间 O(n), 空间 O(n)
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
TreeNode* root = buildTree(xianxu, zhongxu);
vector<int> ans = treeRightView(root);
return ans;
}
// 打印 树右视图
// 层序遍历, 存储最右边的节点
// 时间O(N),空间 O(N)
vector<int> treeRightView(TreeNode* root) {
vector<int> ans;
if (root == nullptr) return ans;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int levelSize = q.size();
for (int i = 0; i < levelSize; i++) {
TreeNode* curNode = q.front();
q.pop();
if (curNode->left) q.push(curNode->left);
if (curNode->right) q.push(curNode->right);
if (i == levelSize - 1) {
ans.push_back(curNode->val);
}
}
}
return ans;
}
// 根据 前序+中序 构建二叉树
TreeNode* buildTree(vector<int>& xianxu, vector<int>& zhongxu) {
unordered_map<int, int> valInMap;
for (int i = 0; i < zhongxu.size(); i++) {
valInMap[zhongxu[i]] = i;
}
TreeNode * tree = buildTreeRec(xianxu, zhongxu, 0, xianxu.size() - 1,
0, zhongxu.size() - 1, valInMap);
return tree;
}
TreeNode* buildTreeRec(vector<int>& xianxu, vector<int>& zhongxu,
int preS, int preE, int inS, int inE, unordered_map<int,int> valInMap) {
//终止条件
if (preS > preE || inS > inE) return nullptr;
//处理
//构建当前节点
int rootVal = xianxu[preS];
TreeNode* root = new TreeNode(rootVal);
//构建左右子树
int rootInIdx = valInMap[rootVal];
int leftTreeSize = rootInIdx - inS;
root->left = buildTreeRec(xianxu, zhongxu, preS + 1, preS + leftTreeSize, inS, rootInIdx - 1, valInMap);
root->right = buildTreeRec(xianxu, zhongxu, preS + leftTreeSize + 1, preE, rootInIdx + 1, inE, valInMap);
return root;
}


京公网安备 11010502036488号