【打卡】牛客网:BM41 输出二叉树的右视图

资料:

1. 将一个容器中的内容追加到另一个容器的后面:

std::vector v1, v2 ;
v1.insert(v1.end(), v2.begin(), v2.end());

c++ 两个vector之间相互赋值,或在一个后面追加另一个_两个vector赋值-CSDN博客 

 2. 模板用到unordered_map(无序map容器,和python的字典很像)

unordered_map mp;

// 判断是否找到,即判断是否等于mp.end():

mp.find(key) == mp.(end)

// 赋新的值:

// mp[key] = val; 

【精选】unordered_map详解_愚蠢的土拨鼠。的博客-CSDN博客

自己写的:

如果vector的赋值操作时间复杂度为线性级别O(n),那么总的时间复杂度应该是O(n^2),比o(n)大。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 求二叉树的右视图
     * @param preOrder int整型vector 先序遍历
     * @param inOrder int整型vector 中序遍历
     * @return int整型vector
     */
    vector solve(vector& preOrder, vector& inOrder) {
        // write code here
        vector ans;
        int n = preOrder.size();
        if(n == 0)
            return ans;
        
        for(int i = 0; i < n; i ++){
            if(preOrder[0] == inOrder[i]){
                ans.push_back(preOrder[0]);

                vector leftpre (preOrder.begin() + 1, preOrder.begin() + i + 1); 
                vector leftvin (inOrder.begin(), inOrder.begin() + i);
                vector leftOrder = solve(leftpre, leftvin);

                vector rightpre (preOrder.begin() + 1 + i, preOrder.end()); 
                vector rightvin (inOrder.begin() + 1 + i, inOrder.end());
                vector rightOrder = solve(rightpre, rightvin);

                ans.insert(ans.end(), rightOrder.begin(), rightOrder.end());
                if(rightOrder.size() < leftOrder.size())
                    ans.insert(ans.end(), leftOrder.begin()+rightOrder.size(), leftOrder.end());
                break;
            }
        }
        return ans;
    }
};

模板的:

1根据前序遍历和中序遍历来建树。

2深度优先搜素:使用的是栈stack(层序遍历使用的是队列queue),且先访问结点的右子节点。

你可能感兴趣的:(算法,数据结构)