LeetCode#199. Binary Tree Right Side View

来源:互联网 发布:深圳火妹网络 编辑:程序博客网 时间:2024/06/17 23:38
  • 题目:站在一棵二叉树的右边,返回能看到的节点的值(一个list)
  • 难度:Medium
  • 思路:根据题目意思可以理解为返回二叉树每一层的最右边的节点的值,所以可以用一个队列来存储每一层的节点,遍历队列里的节点,取当前队列里的最后一个节点值(用一个size来记录上一层节点总数)
  • 代码:
public class Solution {    public List<Integer> rightSideView(TreeNode root) {        List<Integer> result = new ArrayList<>();        if(root == null){            return result;        }        LinkedList<TreeNode> queue = new LinkedList<>();        queue.offer(root);        while(queue.size() > 0){            int size = queue.size();            for(int i = 0; i < size-1; i++){                TreeNode node = queue.poll();                if(node.left != null){                    queue.offer(node.left);                }                if(node.right != null){                    queue.offer(node.right);                }            }            TreeNode nodeAdd = queue.poll();            result.add(nodeAdd.val);            if(nodeAdd.left != null){                queue.offer(nodeAdd.left);            }            if(nodeAdd.right != null){                queue.offer(nodeAdd.right);            }        }        return result;          }}

方法二:递归进行层次遍历,每次遍历的时候先访问右子树,同时通过一个trick(拿结果列表的大小和当前访问的数的层数进行比较)
这种递归的方式居然效率比用队列快(76% VS 27%)

public class Solution {    public List<Integer> rightSideView(TreeNode root) {        List<Integer> result = new ArrayList<Integer>();        rightView(root, result, 0);        return result;    }    public void rightView(TreeNode curr, List<Integer> result, int currDepth){        if(curr == null){            return;        }        if(currDepth == result.size()){            result.add(curr.val);        }        rightView(curr.right, result, currDepth + 1);        rightView(curr.left, result, currDepth + 1);    }}
原创粉丝点击