一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
题目描述
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
思路分析
我们从图上可只,右视图优先级是右子树大于左子树,因此可以考虑进行一个根节点-》右子树-》左子树的方式遍历,如果右子树遍历成功,则不遍历左子树。
具体实现的时候,我最开始还在想要用递归实现,后来发现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;
}
然而并不是这样,会存在左子树比较深的情况,因此更合适的思路其实还是层次遍历
这也更像一个题考我们的难点就是了
层次遍历有一个点一直是我掌握的不是很好的地方,就是层次遍历法如何区分每一层。后来看了题解才知道遍历的时候先获取队列的长度,再嵌套一个for循环。
通过这种方式自然也可以得到每层最右边的节点了。
总结
那么回到刚才的思路,广度优先遍历可以实现的问题,深度优先遍历应该也是可以实现的,毕竟,都是遍历所有节点嘛。
刚才的思路其实是在不断地寻找最右边的节点,但寻找路径也只是一条线,我们想想在一个深度遍历的前提下,是否判断每层最右的节点呢?
当然可以,仅仅需要去在遍历每个节点时,获取其层数,对于层数大于arr.size()时,为其添加进数组。