方法:递归、BFS(层序遍历)

二叉树的右视图就是二叉树每一层的最右结点。

具体方法:

1、利用递归使用前序和中序遍历重建二叉树;

2、对重建后的二叉树进行层序遍历,将每一层的最后一个元素存入数组中,层序遍历完成后就得到二叉树的右视图

时间复杂度:o(n)

空间复杂度:o(n)

class Solution {
  public:
    TreeNode* reConstructBinaryTree(vector<int>& preOrder, vector<int>& vinOrder) {
        if (preOrder.size() == 0 || vinOrder.size() == 0)
            return nullptr;
        TreeNode* head = new TreeNode(preOrder[0]);

        for (int i = 0; i < vinOrder.size(); i++) {
            if (vinOrder[i] == preOrder[0]) {
                //左子树
                vector<int> leftvin(vinOrder.begin(), vinOrder.begin() + i);
                vector<int> leftpre(preOrder.begin() + 1, preOrder.begin() + i + 1);
                head->left = reConstructBinaryTree(leftpre, leftvin);
                //右子树
                vector<int> rightvin(vinOrder.begin() + i + 1, vinOrder.end());
                vector<int> rightpre(preOrder.begin() + i + 1, preOrder.end());
                head->right = reConstructBinaryTree(rightpre, rightvin);
            }
        }

        return head;
    }
    vector<int> solve(vector<int>& preOrder, vector<int>& inOrder) {
        vector<int> right_tree;
        if (preOrder.size() == 0 || inOrder.size() == 0)
            return right_tree;

        //重建二叉树
        TreeNode* head = reConstructBinaryTree(preOrder, inOrder);

        queue<TreeNode*> temp;
        temp.push(head);
        //BFS
        while (temp.size()) {
            int length = temp.size();
            for (int i = 0; i < length; i++) {
                //每一层的最后一个元素保存下就是二叉树的右视图
                if (i == length - 1)
                    right_tree.push_back(temp.front()->val);
                if (temp.front()->left)
                    temp.push(temp.front()->left);
                if (temp.front()->right)
                    temp.push(temp.front()->right);
                temp.pop();
            }
        }
        return right_tree;
    }
};