【LeetCode75】第三十九题 二叉树的右视图

目录

题目:

示例:

分析:

代码:


题目:

【LeetCode75】第三十九题 二叉树的右视图_第1张图片

示例:

【LeetCode75】第三十九题 二叉树的右视图_第2张图片

分析:

题目给我们一棵二叉树,让我们返回站在二叉树右边从上到下看到的节点。

那实际上就是要我们对二叉树进行层序遍历,然后把每层的最右边的一个节点拿出来。

所以问题实际上就是要我们对二叉树进行层序遍历,所以我们这边介绍两种层序遍历的方法,分别是DFS和BFS,也就是深度优先搜索和广度优先搜索。

首先是DFS深度优先搜索,我们先定义一个空的二维数组,是用来存放层序遍历的结果的。

我们对二叉树进行先序遍历,在递归遍历的同时携带一个代表深度的参数。

如果存放结果的二维数组的size也就是里面一维数组的数量小于等于深度,那就是我们第一次碰到这一层的节点,我们就往二维数组的后面塞一个一维的空数组。

然后再根据深度来将当前节点的值塞到二维数组的某个一维数组里。

先序遍历完毕,我们也就层序遍历完毕了。

这是DFS层序遍历的方法。我个人认为比较简单,不过层序遍历最经典的是BFS广度优先搜索,所以这边我们也将一下BFS怎么层序遍历。

我们拿一个队列,首先先把跟节点塞进队列里。

然后进入一个while循环,只要队列为空我们就退出循环,在循环体里我们先给存层序遍历的二维列表里塞一个空的一维列表,然后先记录一下队列的长度,然后再for循环队列长度次数,在for循环里再每次取出一个队列里的节点,把节点的值塞进二维数组的最后一个一维数组里面。

再对节点做判断,如果其左子树不为空,就把左子节点塞进队列里,如果其右子树不为空,把右子节点再塞进去。

这样就是每次我们只取二叉树的一层节点,并且存住每层的节点值后,还把每个节点的子节点塞进了队列,这样队列里就是下一层的节点了。

直到队列为空,那么就表示层序遍历完毕。

最终二维数组就是我们层序遍历的结果。

以上两种方法都可以对二叉树进行层序遍历。而本题中,我们需要把每层的最右边的节点返回出去,所以我们还需要取走二维数组里每个数组的最后一个元素。

代码:

DFS层序遍历

class Solution {
public:
    vector>cache;
    void find(TreeNode* root,int deep){
        if(root==nullptr) return;
        if(cache.size()<=deep) cache.push_back(vector(0));
        cache[deep].push_back(root->val);
        find(root->left,deep+1);
        find(root->right,deep+1);
    }
    vector rightSideView(TreeNode* root) {
        find(root,0);
        vectorres;
        for(auto&c:cache){
            res.push_back(*(c.end()-1));
        }
        return res;
    }
};

BFS层序遍历 

class Solution {
public:
    vector rightSideView(TreeNode* root) {
        if(root==nullptr) return {};
        vector>cache;
        queueq;
        q.push(root);
        while(!q.empty()){
            cache.push_back(vector(0));
            int l=q.size();
            for(int i=0;ival);
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
        }
        vectorres;
        for(auto& c:cache){
            res.push_back(*(c.end()-1));
        }
        return res;
    }
};

你可能感兴趣的:(LeetCode75题解,算法,leetcode,c++,数据结构)