LeetCode 199.二叉树的右视图
题目描述:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1, 2 , 3, null , 5 , null ,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-right-side-view
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
BFS:采用层次遍历的方式,逐层遍历,用集合将每层的最右节点的值记录下来。
DFS:保证每次访问的顺序是 根节点--->右节点--->左节点,这样我们每次访问的第一个节点,都是最右节点,用集合记录下来。
代码
BFS:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> rightSideView(TreeNode root) {
Queue<TreeNode> queue=new LinkedList<>();
List<Integer> arr=new ArrayList<>();
if(root==null) {
return new ArrayList<Integer>();
}
queue.add(root); //记录根节点
while(!queue.isEmpty()){
int len=queue.size();//当前层节点个数
for(int i=0;i<len;i++){//遍历当前层的所有节点
TreeNode treeNode=queue.poll();//当前层节点逐个出队
if(i==len-1){
arr.add(treeNode.val);//记录下当前层的最右一个节点值
}
if(treeNode.left!=null){
queue.add(treeNode.left);//当前节点的左节点入队
}
if(treeNode.right!=null){
queue.add(treeNode.right);//当前节点的右节点入队
}
}
}
return arr;
}
}
DFS:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<Integer> res=new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
dfs(root,0); //从根节点开始访问
return res;
}
public void dfs(TreeNode node,int depth){
if(node==null){
return;
}
if(depth==res.size()){ //如果当前节点的深度不在集合中,就说明该节点是第一个节点,所以将值加入集合
res.add(node.val);
}
depth++;
dfs(node.right,depth); //先遍历右节点
dfs(node.left,depth); //在遍历左节点
}
}
标签:BFS 、DFS