显然这是一个很普通的二叉树的深度优先遍历,从中可以提取出这样的框架:

class TreeNode {

int val;

TreeNode left,

right;

}

public void isFrame (TreeNode root) {

        // 可以做些操作...

        isFram(root.left);

        isFram(root.right);

        // 可以做些操作...  (#)

}

或许对于一些简单的题目,你可以很轻松的利用这个框架,但是中等的,困难的还可以吗?

我们来看标识为(#)的语句。

你了解这个框架,但是你理解这个标识的语句的含义吗,了解它的执行吗?

我们来看一下一道题:

https://leetcode-cn.com/problems/path-sum-ii/

题解:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */
class Solution {// 结果集    private List> res = new ArrayList<>();  // 存储路径    private Dequepath = new LinkedList<>();  public void dfs(TreeNode root, int sum) {if (root == null) return;      // 将第一个节点入路径            path.offerLast(root.val);      sum -= root.val;      // 判断是否已经到达了叶子节点,是否已经满足sum了           if (root.left == null && root.right == null && sum == 0)res.add(new LinkedList(path));      // 根节点不合适,那么就拓展到左右子树看一看            dfs(root.left, sum);      dfs(root.right, sum);      // 不成立的话,需要看一下下一个分支,所以将这个叶子节点给删除            path.pollLast(); // ---(#)    }public List> pathSum(TreeNode root, int sum) {        dfs(root,sum);        return res;    }}

很显然这就是一个深度优先遍历的框架,那么看dfs()内的标识语句(#),你理解吗,这是只依靠知道框架就可以理解的吗?显然不是,但是回想一下二叉树遍历的过程,明确了这行语句的执行位置,我们就不难理解了。

再次希望大家在追求解题方法的同时,可以注重执行过程。

深度优先遍历_二叉树的深度优先遍历,理解框架真的能够套用题目吗?不了解执行过程可能很难。...相关推荐

  1. resultset不支持循环遍历_二叉树的各种遍历方法的简单解释

    二叉树顾名思义,最多两个孩子. 一般规定一个二叉树,因为节点间有相互连接的原因,所以只要给定根节点,那么顺着寻找左孩子和右孩子便可以遍历到所有的节点,这就是遍历的直观解释. 而遍历分为深度遍历和广度遍 ...

  2. java实现二叉树广度优先遍历_二叉树之深度优先和广度优先遍历(Java)

    tree.png 1. 二叉树结构定义 public static class Tree { int data; Tree left; Tree right; public Tree(int data ...

  3. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

    1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...

  4. 二叉树后序遍历_二叉树后序遍历非递归实现

    二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...

  5. 广度优先遍历类似于二叉树的_二叉树的各种遍历方法的简单解释

    二叉树顾名思义,最多两个孩子. 一般规定一个二叉树,因为节点间有相互连接的原因,所以只要给定根节点,那么顺着寻找左孩子和右孩子便可以遍历到所有的节点,这就是遍历的直观解释. 而遍历分为深度遍历和广度遍 ...

  6. 遍历children_二叉树:层序遍历登场!

    登场之后,我要打十个! 看完这篇文章虽然不能打十个,但是可以迅速打五个!而且够快! 102.二叉树的层序遍历 给你一个二叉树,请你返回其按 层序遍历 得到的节点值.(即逐层地,从左到右访问所有节点). ...

  7. 二叉树的前序遍历,二叉树的中序遍历,二叉树的后序遍历,二叉树的层序遍历

    二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣(LeetCode) (leetcode-cn.com) 给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 示例 1: 输入:root ...

  8. 多叉树的前序遍历_二叉树的非递归遍历的思考

    封面图来自wikipedia 1 简介 二叉树的深度优先遍历(前序遍历.中序遍历.后序遍历)是一个比较基本的操作.如果使用递归的做法,很容易写出相应的程序:而如果使用非递归的做法,虽然也能写出相应的代 ...

  9. c++ 结构体遍历_二叉树(Binary Tree)的建立与遍历——C语言实现

    一.运行环境简介 编辑器:VSCode + MicroSoft原生插件; :cat:‍:dragon:运行环境: MinGW ; :cat:‍:bust_in_silhouette:常用指令: gcc ...

最新文章

  1. Request To JavaBean(请求对象转换为JavaBean对象)
  2. 【数论】【Polya定理】【枚举约数】【欧拉函数】【Java】poj2154 Color
  3. FPGA管脚分配需要考虑的因数
  4. 数据中心柴油发电机组功率有哪几种?
  5. 【设计】H5移动端页面设计心得分享(附案例解析)
  6. 读取数量不定的输入数据
  7. 给i茅台APP提几个建议
  8. 《BOOST程序库完全开发指南》 第04章 实用工具
  9. 赢在微点答案专区英语_2019年KPL秋季赛总决赛明日开启 线上观赛赢海量福利
  10. Spring 创建Bean的三种方式
  11. CentOS用户及用户组管理
  12. 如何终止Java线程
  13. GDB scheduler-locking 命令详解
  14. 提升专业素养之软件工程概述
  15. 浅谈数据分析和数据建模
  16. 小米浏览器禁止java,如何禁止小米手机浏览器中弹出窗口广告
  17. Data Migration 架构
  18. 通过位与方法获取三色值,十六进制色值转换RGB
  19. [unity]在unity中创建圆锥体
  20. Ubuntu16.04 64位系统下面安装JDK1.7

热门文章

  1. 使用KiWi Syslog Daemon构建日志服务器
  2. 硬分叉升级加速BCH相关应用研发
  3. AES加密_ js与C#互通
  4. 驰骋工作流引擎的流程属性-节点属性-前台操作
  5. 使用进程池模拟多进程爬取url获取数据,使用进程绑定的回调函数去处理数据...
  6. [转]英语飙升的好方法
  7. 程序员的十层楼(8~9层)
  8. NOD32杀毒软件 №20070217(非官方版本)
  9. 无锡朗贤获B+轮融资,辰韬资本、兴韬投资领投
  10. 详解tomcat的连接数与线程池