原题
原题链接:https://leetcode.com/problems/binary-tree-right-side-view/
解法概览
解法1:迭代法,BFS
解法2:递归,参考了https://discuss.leetcode.com/topic/11768/my-simple-accepted-solution-java/7
解法1
解题思路
采用层级遍历,每一个子循环中队列保存第i层的所有节点,取出最后进队列的节点(也就是最右侧的节点),将其值加入List<Integer>中即可。
思路与代码与LeetCode题解-104-Maximum Depth of Binary Tree类似。
代码
public class Solution199_DFS_iterator {
public List<Integer> rightSideView(TreeNode root) {
Deque<TreeNode> deque = new LinkedList<TreeNode>();
List<Integer> list = new ArrayList<Integer>();
if (root != null)
deque.push(root);
while (!deque.isEmpty()){
int dequeSize = deque.size();
while (dequeSize -- > 0){
TreeNode currentNode = deque.pop();
if (dequeSize == 0)
list.add(currentNode.val);
if (currentNode.left != null)
deque.addLast(currentNode.left);
if (currentNode.right != null)
deque.addLast(currentNode.right);
}
}
return list;
}
}
解法2
解题思路
由于每层只选择一个节点,所以优先访问右侧的节点。当List<Integet>的大小与层的深度一致时,说明已经加入了最右侧的节点,该层的其他节点无需再加入。
图解
代码
public class Solution199_recursive {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
rightView(root, list, 0);
return list;
}
private void rightView(TreeNode root, List<Integer> list, int currentDepth) {
if (root == null)
return;
if (currentDepth == list.size())
list.add(root.val);
rightView(root.right, list, currentDepth + 1);
rightView(root.left, list, currentDepth + 1);
}
}