考察知识点: 树的遍历、深度优先搜索

题目分析:

 该题目要求求出一个二叉树的仰视图。实际上是让求叶子节点,在下图中,根节点是不会被看到的:

alt

 上面这幅图的仰视图是2,而不是1和2。感觉题目描述的不是很清楚,仰视图的在这里的定义比较模糊。

 那要从左到右求叶子节点的话,只需要保证左孩子先于右孩子先被遍历到即可。那么无论是先序遍历中序遍历还是后序遍历都可以解决原问题。这三种遍历方式在代码上的区别就是递归函数与其中的用于访问节点的语句之间的相对位置。

 以先序遍历为例,在判断递归的基准条件之后,先访问该层递归对应的节点,然后再向左子树和右子树进行递归。

所用编程语言: C++

先序遍历

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型vector
     */
    void traverse(TreeNode *root, vector<int> &res) {
        if (!root) return;
        if (!root->left && !root->right) {
            res.push_back(root->val);
        }
        traverse(root->left, res);
        traverse(root->right, res);
    }
    vector<int> bottomView(TreeNode* root) {
        // write code here
        vector<int> res;
        traverse(root, res);
        return res;
    }
};