Binary Tree Right Side View

来源:互联网 发布:domori巧克力知乎 编辑:程序博客网 时间:2024/06/05 23:58

Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.

For example:
Given the following binary tree,

   1            <--- /   \2     3         <--- \     \  5     4       <---

You should return [1, 3, 4].



这道题想到了dfs的解法,跟之前做的一道题类似。然而突然发现可以用bfs做,每一层取最右边的那一个元素就可以。待会看看给补上。

dfs的解法比较巧妙,这里按照层去往result结果集添加结果,采用先序遍历,因为根节点这一层没有个跟它同一层的点,所以可以先计算也可以后计算。因为看的是右试图,所以需要先递归左孩子然后递归右孩子,这样如果右孩子有跟左孩子同一层的元素可以更新;这样子,填写result list的顺序就是顺序的,所以也就是可以直接返回的顺序。

代码:

public List<Integer> rightSideView(TreeNode root) {        List<Integer> result = new ArrayList<>();        if(root == null) return result;        dfs(result, root, 0);        return result;    }    private void dfs(List<Integer> result, TreeNode root, int level){        if(root == null) return;        if(result.size() == level){            result.add(root.val);        }else{            result.set(level, root.val);        }        dfs(result, root.left, level+1);        dfs(result, root.right, level+1);    }


使用bfs来写也是可以的,不过不知道为什么效率会差很多。但是思路很清楚,用两个技术统计当前层的个数和上一层的个数,当上一层的个数减小到0的时候,说明上面那一层刚好走到最后一个元素,这个时候把最后一个元素添加到结果集当中(顺序添加就好)。然后当前层的个数赋值给前一层,当前层的个数重置为0.

也就是一般的bfs。

代码:

public List<Integer> rightSideView(TreeNode root) {        List<Integer> result = new ArrayList<>();        if(root == null) return result;        bfs(result, root);        return result;    }    private void bfs(List<Integer> result, TreeNode root){        Queue<TreeNode> queue = new LinkedList<>();        queue.offer(root);        int preLevel = 1;        int curLevel = 0;        int level = 0;        while(!queue.isEmpty()){            TreeNode node = queue.poll();            if(node.left != null){                curLevel++;                queue.offer(node.left);            }            if(node.right != null){                curLevel++;                queue.offer(node.right);            }            preLevel--;            if(preLevel == 0){                System.out.println("add:"+node.val);                result.add(level++, node.val);                preLevel = curLevel;                curLevel = 0;            }        }    }



0 0