先等价转一下题意为
“从上至下保存树的每一层的最右节点”
那么我的大致思路可以归纳为:
1. DFS遍历树,把节点和对应的层数标记在一个HashMap里
2. BFS对整棵树构建一个完整的队列, 这个队列的特点就是按一层一层连接起来的
3. 从头遍历队列,根据Hashmap里的层数标记找出每层的最右节点,具体方法是维护一个pre变量保存之前的节点,如果当前节点值与之不等,则把pre加入结果集,另外队尾也要加入结果集
Ps: 本来第二步也打算用iterator遍历结果出了异常,发现是在使用iterator访问元素时,不允许其他线程remove或add元素,故新建了一个容器接收弹出的队尾
另外Binary Tree Zigzag Level Order Traversal 这题主要也是划分树层,所以可以用相同的思路来操作
Java Code:
public class Solution { Map<TreeNode, Integer> levelMap; public List<Integer> rightSideView(TreeNode root) { if(root == null) return new ArrayList<Integer>(); List<Integer> list = new ArrayList<Integer>(); levelMap = new HashMap<TreeNode, Integer>(); LinkedList<TreeNode> queue = new LinkedList<TreeNode>(); preorder(root, 1); queue.addFirst(root); LinkedList<TreeNode> newqueue = new LinkedList<TreeNode>(); while(!queue.isEmpty()) { TreeNode node = queue.removeLast(); if(node.left != null) queue.addFirst(node.left); if(node.right != null) queue.addFirst(node.right); newqueue.addFirst(node); } TreeNode pre = null; while(!newqueue.isEmpty()) { TreeNode node = newqueue.removeLast(); if(pre != null) if(levelMap.get(pre) != levelMap.get(node)) list.add(pre.val); if(!newqueue.isEmpty()) { pre = node; } else { list.add(node.val); } } return list; } public void preorder(TreeNode root, int level) { if(root == null) return; levelMap.put(root,level); preorder(root.left, level + 1); preorder(root.right, level + 1); } }
时间: 2024-11-07 07:30:58