199. 二叉树的右视图

920 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

题目描述

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

截屏2022-04-07 下午3.05.52.png

思路分析

我们从图上可只,右视图优先级是右子树大于左子树,因此可以考虑进行一个根节点-》右子树-》左子树的方式遍历,如果右子树遍历成功,则不遍历左子树。

具体实现的时候,我最开始还在想要用递归实现,后来发现while循环就可以解决

vector<int> rightSideView(TreeNode* root) {
        TreeNode* tmp = root;
        vector<int> ret;
        while(tmp != nullptr) {
            ret.push_back(tmp -> val);
            if(tmp -> right != nullptr){
                tmp = tmp -> right;
            }else{
                tmp = tmp -> left;
            }
        }
        return ret;
    }

截屏2022-04-07 下午11.17.56.png

然而并不是这样,会存在左子树比较深的情况,因此更合适的思路其实还是层次遍历

这也更像一个题考我们的难点就是了

层次遍历有一个点一直是我掌握的不是很好的地方,就是层次遍历法如何区分每一层。后来看了题解才知道遍历的时候先获取队列的长度,再嵌套一个for循环。

通过这种方式自然也可以得到每层最右边的节点了。

总结

那么回到刚才的思路,广度优先遍历可以实现的问题,深度优先遍历应该也是可以实现的,毕竟,都是遍历所有节点嘛。

刚才的思路其实是在不断地寻找最右边的节点,但寻找路径也只是一条线,我们想想在一个深度遍历的前提下,是否判断每层最右的节点呢?

当然可以,仅仅需要去在遍历每个节点时,获取其层数,对于层数大于arr.size()时,为其添加进数组。