二叉树--二叉树的右视图
Posted 算法和数据结构
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树--二叉树的右视图相关的知识,希望对你有一定的参考价值。
来源:LeetCode
难度:中等
描述:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例1:
分析:所谓右视图,就是从右边往左边看,看到的每层的节点值,也就是每层中最右边的值,所以咱们只需要把二叉树的每一层最右边的那个节点值保存下来即可,而找每层最右的节点可利用深度优先搜索和广度优先搜索两种方法,具体如下
解题
方法一:广度优先搜索
思路:采用广度优先搜索对二叉树进行层序遍历,并且将每层的最后一个元素记录下来即可
代码:
1public List<Integer> rightSideView(TreeNode root) {
2 if (root == null) {
3 return new ArrayList<>();
4 }
5 List<Integer> ansList = new ArrayList<>();
6 Queue<TreeNode> queue = new LinkedBlockingQueue<>();
7 queue.add(root);
8 while (!queue.isEmpty()) {
9 //记录每层的节点个数
10 int size = queue.size();
11 for (int i = 0; i < size; i++) {
12 TreeNode treeNode = queue.poll();
13 if (treeNode == null) {
14 continue;
15 }
16 //保留最后一个节点
17 if (i == size - 1) {
18 ansList.add(treeNode.val);
19 }
20 //将每个节点的子节点入队
21 if (treeNode.left != null) {
22 queue.add(treeNode.left);
23 }
24 if (treeNode.right != null) {
25 queue.add(treeNode.right);
26 }
27 }
28 }
29 return ansList;
30}
时间复杂度:O(n)
空间复杂度:O(n)
方法二:深度优先搜索
思路:采用深度优先搜索的方式按照 根,右,左的顺序对二叉树进行遍历,这样就能保证每一层咱们第一个访问到的都是最右边的节点(和广搜正好相反)
需要注意的是咱们需要记录搜索的深度,这里深度从0开始计算,那么当深度和结果数组一样大时,表明该层最先遍历到的节点还未放入结果数组,所以将当前节点值放入结果数组即可(因为第一个遍历的就是该层最右边的节点)
代码:
1public List<Integer> rightSideView(TreeNode root) {
2 List<Integer> ansList = new ArrayList<>();
3 // 从根节点开始访问,根节点深度是0
4 dfs(root, 0, ansList);
5 return ansList;
6}
7
8private void dfs(TreeNode root, int depth, List<Integer> ansList) {
9 if (root == null) {
10 return;
11 }
12 // 先访问 当前节点,再递归地访问 右子树 和 左子树。
13 if (depth == ansList.size()) {
14 // 如果当前节点所在深度还没有出现在res里
15 // 说明在该深度下当前节点是第一个被访问的节点,因此将当前节点加入res中。
16 ansList.add(root.val);
17 }
18 depth++;
19 dfs(root.right, depth, ansList);
20 dfs(root.left, depth, ansList);
21}
时间复杂度:O(n)
空间复杂度:O(n)
以上仅是个人思路解法,觉得还不错欢迎点赞关注分享
往期精彩推荐
以上是关于二叉树--二叉树的右视图的主要内容,如果未能解决你的问题,请参考以下文章