- 題目:站在一棵二叉樹的右邊,返回能看到的節點的值(一個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);
}
}