传送门
题目:给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
1 <---
/ \
2 3 <---
\ \
5 4 <---
我们对树进行深度优先搜索,在搜索过程中,我们总是先访问右子树。那么对于每一层来说,我们在这层见到的第一个结点一定是最右边的结点。
这样一来,我们可以存储在每层深度访问的第一个结点,一旦我们知道了树的层数,就可以得到最终的结果数组。
public List<Integer> rightSideView(TreeNode root) {
if (root == null) return new ArrayList<>();
Map<Integer, TreeNode> hash = new HashMap<>();
Stack<Integer> stkDepth = new Stack<>();
Stack<TreeNode> stk = new Stack<>();
stkDepth.push(0);
stk.push(root);
while (!stk.empty()) {
TreeNode peekNode = stk.pop();
int depth = stkDepth.pop();
// 如果不存在对应深度的节点我们才插入
if (!hash.containsKey(depth)) hash.put(depth, peekNode);
if (peekNode.left != null) {
stk.push(peekNode.left);
stkDepth.push(depth + 1);
}
if (peekNode.right != null) {
stk.push(peekNode.right);
stkDepth.push(depth + 1);
}
}
List<Integer> ans = new ArrayList<>();
for (TreeNode node : hash.values()) ans.add(node.val);
return ans;
}