- 题目:站在一棵二叉树的右边,返回能看到的节点的值(一个list)
- 难度:Medium
- 思路:根据题目意思可以理解为返回二叉树每一层的最右边的节点的值,所以可以用一个队列来存储每一层的节点,遍历队列里的节点,取当前队列里的最后一个节点值(用一个size来记录上一层节点总数)
- 代码:
public class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root == null){
return result;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(queue.size() > 0){
int size = queue.size();
for(int i = 0; i < size-1; i++){
TreeNode node = queue.poll();
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
TreeNode nodeAdd = queue.poll();
result.add(nodeAdd.val);
if(nodeAdd.left != null){
queue.offer(nodeAdd.left);
}
if(nodeAdd.right != null){
queue.offer(nodeAdd.right);
}
}
return result;
}
}
方法二:递归进行层次遍历,每次遍历的时候先访问右子树,同时通过一个trick(拿结果列表的大小和当前访问的数的层数进行比较)
这种递归的方式居然效率比用队列快(76% VS 27%)
public class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
rightView(root, result, 0);
return result;
}
public void rightView(TreeNode curr, List<Integer> result, int currDepth){
if(curr == null){
return;
}
if(currDepth == result.size()){
result.add(curr.val);
}
rightView(curr.right, result, currDepth + 1);
rightView(curr.left, result, currDepth + 1);
}
}