题目:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
解法一
思路:
利用树的广度优先遍历BFS,遍历每层的最后一个节点,将其存放到list集合中
代码:
public static List<Integer> rightSideView(TreeNode root) {
//定义存放结果的集合
List<Integer> ret = new ArrayList<>();
//判断树是否为空
if (root == null){
return ret;
}
//定义队列存放待查询的节点
Queue<TreeNode> nodes=new LinkedList<>();
//树根入队
nodes.offer(root);
//层次遍历(BFS广度优先遍历)
while (!nodes.isEmpty()){
int size = nodes.size();
//循环当前层,从左往右出队
for (int i = 0; i < size; i++) {
TreeNode node = nodes.poll();
//判断当前节点左子树
if (node.left!=null){
nodes.offer(node.left);
}
//判断当前节点右子树
if (node.right!=null){
nodes.offer(node.right);
}
//到达当前层最右节点
if (i == size-1){
ret.add(node.val);
}
}
}
return ret;
}
解法二
思路:
采用深度优先遍历dfs,即我们按照 「根结点 -> 右子树 -> 左子树」 的顺序访问, 就可以保证每层都是最先访问最右边的节点的。利用递归就可以遍历整个树结构。
代码:
//定义list集合
List<Integer> ret = new ArrayList<>();
//后序遍历
public List<Integer> rightSideView1(TreeNode root){
dfs(root,0);
return list2;
}
private void dfs(TreeNode root, int i) {
if (root==null){
return;
}
//先访问当前层的节点,再递归右子树,左子树
if (i==list2.size()){
list2.add(root.val);
}
i++;
dfs(root.right,i);
dfs(root.left,i);
}
以上两种遍历树的方法,均十分重要,博主建议小伙伴们牢记深度优先dfs和广度优先bfs遍历树的算法