Binary Tree Right Side View

来源:互联网 发布:角木肇 知乎 编辑:程序博客网 时间:2024/06/11 21:12

思考:只需要知道每一行的最后一个节点值即可。

方法

  • 1、考虑使用两个队列进行BFS,A队列存放当前行的节点,B队列存放当前节点的子节点,即当A队列空时,最后一个访问的节点即位当前行的最后一个节点。
  • 2、递归遍历。每一层都会有一个值加入列表,即可以利用DFS来遍历,并传入当前深度level(root为1),如果当前深度等于re(结果列表)的长度,即将re的第level个值更新为当前节点的值(每一行的最后一个节点会覆盖其之前的所有节点,这样re中存的就是最右边的值)。如果level大于re的长度,则添加当前节点值为re的第level个值(level只会比re长度大一,所以直接add就可以)。

代码块

利用双队列

    public class Solution {        public List<Integer> rightSideView(TreeNode root) {            Queue<TreeNode> q1 = new LinkedList<TreeNode>();            List<Integer> re = new LinkedList<Integer>();            if(root == null)                return re;             q1.add(root);            while(!q1.isEmpty()){                Queue<TreeNode> q2 = new LinkedList<TreeNode>();                TreeNode temp = null;                while(!q1.isEmpty()){                    temp = q1.poll();                    if(temp.left != null)                        q2.add(temp.left);                    if(temp.right != null)                        q2.add(temp.right);                }                re.add(temp.val);                q1.addAll(q2);            }            return re;        }    }

利用递归

    public class Solution {        public List<Integer> rightSideView(TreeNode root) {            List<Integer> re = new LinkedList<Integer>();            DFSRightView(root, 1, re);            return re;        }        void DFSRightView(TreeNode node, int level, List<Integer>re){            if(node == null)                return;            if(level > re.size())   re.add(node.val);            else    re.set(level - 1, node.val);            DFSRightView(node.left, level + 1, re);            DFSRightView(node.right, level + 1, re);        }    }
0 0