Description:
题目大意:给出二叉树的前序遍历和中序遍历,输出右视图。
解题思路:
算法标签:BFS
- 通过前序遍历和中序遍历构造二叉树。
- 利用层序遍历找到右视图。
代码:
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
unordered_map<int ,int>rightview;
int maxdepth = -1;
queue<TreeNode*>tree;
queue<int>treedepth;
tree.push(root);
treedepth.push(0);
while(!tree.empty()) {
TreeNode* node = tree.front();
tree.pop();
int depth = treedepth.front();
treedepth.pop();
if(node != NULL) {
maxdepth = max(maxdepth , depth);
// 层序遍历最后访问的节点便是每一层的最右节点,因此不断更新即可
rightview[depth] = node -> val;
// 因为是栈结构,所以左子树先入栈,但是先访问的都是右子树
tree.push(node -> left);
tree.push(node -> right);
treedepth.push(depth + 1);
treedepth.push(depth + 1);
}
}
vector<int>rightviewans;
for(int i = 0;i <= maxdepth ;i++) {
rightviewans.push_back(rightview[i]);
}
return rightviewans;
}
TreeNode* built(vector<int>& preorder, int pl ,int pr ,vector<int>& inorder , int inl ,int inr ,map<int , int>& inorder_index) {
if(pl > pr || inl > inr)
return nullptr;
// 如果是单独一个节点
if(pl == pr || inl == inr)
return new TreeNode(preorder[pl]);
// 前序遍历第一个节点是根节点
TreeNode* root = new TreeNode(preorder[pl]);
// 找到中序遍历中对应节点的下标
int index = inorder_index[preorder[pl]];
// 生成左子树
int leftsize = index - inl;
root -> left = built(preorder, pl + 1, pl + leftsize, inorder, inl, index - 1, inorder_index);
// 生成右子树
root -> right = built(preorder, pl + leftsize + 1, pr, inorder, index + 1, inr, inorder_index);
return root;
}
vector<int> solve(vector<int>& preorder, vector<int>& inorder) {
map<int ,int>inorder_index;
vector<int> ans;
if(preorder.size() == 0 || inorder.size() == 0)
return ans;
// 构建中序遍历值和下标的映射
for(int i = 0;i < inorder.size();i++)
inorder_index.insert(pair<int, int>(inorder[i] , i));
// 构建二叉树
TreeNode* root = built(preorder , 0 , preorder.size() - 1, inorder , 0 ,inorder.size() - 1 , inorder_index);
// 构造右视图
return rightSideView(root);
}
};