题目
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
代码
最开始想到的,不正确。
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list=new ArrayList<>();
TreeNode node=root;
while(node!=null)
{
list.add(node.val);
//System.out.println(list);
if(node.right!=null)
node=node.right;
else if(node.left!=null)
node=node.left;
else break;
}
return list;
}
}
/**
* 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<>();
Queue<TreeNode> queue = new ArrayDeque<>();
if(root!=null)
queue.add(root);
while(!queue.isEmpty())
{
int n=queue.size();
for(int i=0;i<n;i++)
{
TreeNode node=queue.poll();
if(i==n-1)
res.add(node.val);
if(node.left!=null)
queue.add(node.left);
if(node.right!=null)
queue.add(node.right);
}
}
return res;
}
}
反思
1、和遍历相关的问题,想想和熟知的BFS/DFS的关系,想到了所求机试DFS每层最后的节点。
2、好的思路:
代码:
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
dfs(root, 0); // 从根节点开始访问,根节点深度是0
return res;
}
private void dfs(TreeNode root, int depth) {
if (root == null) {
return;
}
// 先访问 当前节点,再递归地访问 右子树 和 左子树。
if (depth == res.size()) { // 如果当前节点所在深度还没有出现在res里,说明在该深度下当前节点是第一个被访问的节点,因此将当前节点加入res中。
res.add(root.val);
}
depth++;
dfs(root.right, depth);
dfs(root.left, depth);
}
}