在LeetCode上面刷题刷到一道二叉树的题,这道题我认为对学习树的深度优先和广度优先算法有一定的帮助,先来看一下题
这道题是这样的:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

这道题有两种思路一种是深度优先一种是广度优先
深度优先
见名知意这种思路就是先从深度遍历,我们先去往深处遍历,由于这道题是寻找每一层最右面的值,我们可以总是先访问右子树。这样就保证了当我们访问树的某个特定深度时,我们正在访问的节点总是该深度的最右侧节点。于是,可以存储在每个深度访问的第一个结点,一旦我们知道了树的层数,就可以得到最终的结果。
代码如下:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public List<Integer> rightSideView(TreeNode root) {Map<Integer, Integer> map = new HashMap<Integer, Integer>();int max_depth = -1;Stack<TreeNode> nodeStack = new Stack<TreeNode>();Stack<Integer> depthStack = new Stack<Integer>();nodeStack.push(root);depthStack.push(0);while (!nodeStack.isEmpty()) {TreeNode node = nodeStack.pop();int depth = depthStack.pop();/*关键点如果节点为空就去找他的根节点的左节点,如果还为空返回上一级去找,如此循环,直到全部出栈*/if (node != null) {max_depth = Math.max(max_depth, depth);/*判定这个map里是否有这个key的值*/if (!map.containsKey(depth)) {map.put(depth, node.val);}nodeStack.push(node.left);nodeStack.push(node.right);depthStack.push(depth+1);depthStack.push(depth+1);}}/*使用list去接受map里的value的值*/List<Integer> rightView = new ArrayList<Integer>();for (int depth = 0; depth <= max_depth; depth++) {rightView.add(map.get(depth));}return rightView;}
}

广度优先
同样很容易看到这个词的1意思,就是从宽度下手,跟深度优先正好相反,每一层每一层的去遍历,直到最后一层,我们对每一层都从左到右访问。因此,通过只保留每个深度最后访问的结点,我们就可以在遍历完整棵树后得到每个深度最右的结点。
代码如下:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public List<Integer> rightSideView(TreeNode root) {//这个和二叉树的层序遍历区别在于,只需要保存最右边的TreeNode即可List<Integer>list=new ArrayList<Integer>();if(root==null)return list;int level=0;Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.add(root);while ( !queue.isEmpty() ) {int level_length = queue.size();for(int i = 0; i < level_length; ++i) {/*关键点如果是这一层的最后一个就输出他*/if(i==level_length-1){list.add(queue.peek().val);}TreeNode node = queue.remove();if (node.left != null) queue.add(node.left);if (node.right != null) queue.add(node.right);    }level++;}return list;}
}

上面是这个题的两种解法,一个使用的是栈一个使用的是队列,分别应用了栈后入先出的特向和队列先进先出的特性,上面的关键点已经标出,只要花时间就可以看懂,这道题难度不高,我认为可能对DFS和BFS有一定的理解

深度优先和广度优先算法(例题)相关推荐

  1. python爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法

    深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程. 一.网站的树结构 1.1.一个网站的url结构图 以知乎为例,知乎目前有发现.话题.Live.书店.圆桌. ...

  2. 图的深度优先和广度优先算法(DFS递归与非递归)

    无向图--邻接矩阵的深度优先和广度优先算法实现 测试环境:VS2008(C) [cpp:showcolumns] view plaincopyprint? ·········10········20· ...

  3. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

  4. 算法之深度优先、广度优先算法

    目录 前言: 搜索算法: 广度优先搜索算法 深度优先搜索算法 问题:如何找出社交网络中某个用户的三度好友关系? 总结: 参考资料: 前言: 图这种数据结构经常用于表示一个社交网络,在社交网络中有一个六 ...

  5. 图的基础知识及深度优先、广度优先算法

    图是一种可以表达复杂结构化信息的基本结构,关于图的例子可以自行百度.首先统一一下图中组成部分的叫法,这里把图中包含的元素叫做顶点,两两元素之间的关系叫做边.有时图中的边会带有更多的信息,比如边的方向, ...

  6. 树型结构的深度优先和广度优先算法

    构造一个树模型 const tree = {val: 'a',children: [{val: 'b',children: [{val: 'd',children: [{val: 'g',childr ...

  7. 无向图—深度优先和广度优先算法极其应用

    首先在这里介绍下Algorithms这个网站第二部分,是Algorithms这本书的在线课程. 另外Coursera上的图上的算法的这个课程也很不错. 图的几种表示方法: 用那种方式(数据结构)表示图 ...

  8. 深度搜索和广度搜索领接表实现_数据结构与算法--图的搜索(深度优先和广度优先)...

    数据结构与算法--图的搜索(深度优先和广度优先) 有时候我们需要系统地检查每一个顶点或者每一条边来获取图的各种性质,为此需要从图的某个顶点出发,访遍图中其余顶点,且使得每一个顶点只被访问一次,这个过程 ...

  9. (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)

    链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构   队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...

最新文章

  1. [生活化技术]组合模式 vs. 理发店价格表
  2. seaJs api 帮助文档
  3. Android自定义View详解,知乎上转疯了!
  4. c语言输入10个国名要求按字母顺序输出,编写程序,输入10至20个城市名,按字母顺序输出城市名清单。...
  5. 工业机器人调运角度_站在全球角度,看待中国工业机器人
  6. Yii的查询后缀限定
  7. MapReduce概述
  8. 「最简单」的 Core Data 上手指南
  9. 接口文档下的渗透测试(Swagger)
  10. 文本框仅可接收decimal
  11. python 怎么调用 矩阵 第几行_python工厂第19层 多重列表1
  12. 2015年 StoiGdoi 反思总结与未来计划
  13. 1188 最大公约数之和 V2
  14. 集异璧摘录:pq系统-加法-乘法-合数-素数
  15. python获取APP夸克答题助手答案
  16. 分库分表知识详解与分库分表中间件介绍
  17. 远程桌面连接 提示用户名密码错误的解决办法
  18. Oracle,emc,emulex联合测试T10
  19. 关键字: CCTV5 天下足球 盗版
  20. RFID图书馆和传统图书馆的区别

热门文章

  1. MySQL如何存储图片
  2. 基于最小二乘法的无线定位技术研究与仿真_程序
  3. 传智播客 崔希凡JavaWeb培训视频day19 客户管理系统原型
  4. 跪着看完这14个机械动图
  5. Tableau-面积图
  6. ReNamer Pro — 批量修改命名文件夹,功能强大
  7. linu修改open files无效_ReNamer Pro — 批量修改命名文件夹,功能强大
  8. svr公式推导_关于污泥回流比计算公式的推导!
  9. 利用SQL语句实现分析需求(1)
  10. 重头开始设计一个系统吧