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
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Binary Tree Right Side View
- Hession与Webservice的区别
- 数据结构:二叉查找树的相关操作
- JavaScript 运行机制详解:再谈Event Loop
- [leetcode][83]Remove Duplicates from Sorted List
- [leetcode][67] Add Binary
- Binary Tree Right Side View
- 学习的文档位置
- TEC1401.Report开发技术总结 - 第七章 使用BI Publisher开发报表-创建一个简单的RTF模板(2/5)
- TEC1401.Report开发技术总结 - 第八章 使用BI Publisher开发报表-在EBS应用中部署BIP报表(3/5)
- Leetcode 99. Recover Binary Search Tree (Hard) (cpp)
- [leetcode][155] Min Stack
- Spring架构图
- TEC1401.Report开发技术总结 - 第九章 使用BI Publisher开发报表-使用BI Publisher创建RTF模板的语法(4/5)
- HDUoj 2141 Can you find it?(排序+二分)