码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 随笔之 ------ Binary Tree Right Side View

时间:2015-05-27 11:54:02      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

先等价转一下题意为

“从上至下保存树的每一层的最右节点”

 

那么我的大致思路可以归纳为:

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);
        
    }
    
   
}

 

Leetcode 随笔之 ------ Binary Tree Right Side View

标签:

原文地址:http://www.cnblogs.com/ningo/p/4532917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!