目录
1.每日一句
盛不盛开,花都是花
2.作者简介
🏡个人主页:XiaoXiaoChen-2716
📚学习专栏:力扣专栏
🕒发布日期:2022/10/10
『LeetCode|每日一题』二叉树的右视图
1.每日一题
2.解题思路
2.1 思路分析(DFS)
刚开始就是不想用dfs和bfs,然后也是先看右子树再看左子树的思路,最后发现了问题,如果当前的右子树它没有右子树了,那么此时要返回去遍历左子树,但是如果此时改变了当前节点,那么就无法遍历下面的了,所以还是用了dfs
S1:首先确定dfs函数应该传什么参数,第一个肯定要当前节点,第二个就是遍历的深度,如果当前深度还没有遍历过的话,那么肯定要添加进res中;
S2:遍历完这次之后要记得把遍历深度加一,然后继续遍历
S3:遍历的顺序和先序遍历刚好相反,要先遍历右子树,所以先是dfs(root.right , depth),然后是dfs(root.left , depth);
S4:最后在方法中,首先传入root,然后遍历深度开始是0,当然定义了一个全局的链表res存结果
2.2 核心代码(DFS)
private void dfs(TreeNode root , int depth){
if(root == null){
return ;
}
if(depth == res.size()){
res.add(root.val);
}
depth++;
dfs(root.right , depth);
dfs(root.left , depth);
}
2.3 完整代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
dfs(root , 0);
return res;
}
private void dfs(TreeNode root , int depth){
if(root == null){
return ;
}
if(depth == res.size()){
res.add(root.val);
}
depth++;
dfs(root.right , depth);
dfs(root.left , depth);
}
}
2.4 运行结果
既然可用dfs,那么当然bfs也同样适用,请看下面的解答
3.解题思路(BFS)
3.1 思路分析
bfs的思路和dfs不太一样,bfs的思路大概就是利用广度优先搜索遍历每层的最后一个节点,也就是最右边的那个节点
S1:首先定义一个链表存结果,然后定义一个队列,用来放每一层的所有节点;
S2:核心的地方就是利用层次遍历(前提是队列不能为空,为空就停止遍历了),然后先左后右的方法(先把左节点放进队列,然后把右节点放进队列)来遍历,保证最右边的元素一定是最后一个遍历到的;
S3:一层一层的处理,然后每次只要把当前这一层的最后一个节点放进链表里就可以了
3.2 核心代码(BFS)
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(queue.isEmpty() == false){
int len = queue.size();
for(int i = 0 ; i < len ; i++){
TreeNode empty = queue.poll();
if(empty.left != null){
queue.offer(empty.left);
}
if(empty.right != null){
queue.offer(empty.right);
}
if(i == len - 1){
res.add(empty.val);
}
}
}
3.3 完整代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null){
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(queue.isEmpty() == false){
int len = queue.size();
for(int i = 0 ; i < len ; i++){
TreeNode empty = queue.poll();
if(empty.left != null){
queue.offer(empty.left);
}
if(empty.right != null){
queue.offer(empty.right);
}
if(i == len - 1){
res.add(empty.val);
}
}
}
return res;
}
}
3.4 运行结果
🍁 类似题目推荐:
如果文章对各位大佬有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!