目前工作中遇到如下问题,对象之间有依赖关系,抽象来看作一棵二叉树,最上层的是root节点,而父节点会依赖子节点。如果现在有一些节点已经标记为无效,我们要删除这些无效节点。如果无效节点的依赖的节点还有效,那么不应该删除,如果无效节点和它的子节点都无效,则可以删除。

如下图所示

看到这个问题,第一个想法就是递归,而二叉树的递归有:前序遍历,中序遍历和后序遍历。

最开始我只是确定要递归,根本就没有考虑什么顺序,我的流程如下:

public TreeNode pruneTree (TreeNode root) {

if (root.val ==

0 && root.left.val == 0 && root.right.val ==0) {

return null;

}

root.left

= pruneTree(root.left);

root.right

= pruneTree(root.right);

}

这里看到一个明显的异常的情况是

因此剪枝只能从叶子节点开始遍历,然后再遍历父节点,这样才能保证每次剪枝是逐级剪去无用的节点,到父节点的时候无用的节点都已经去掉,只需要判断当前节点和它的子节点是否为0就可以了。这个时候我明白,和二叉树的遍历顺序有关系。

在递归里面前序,中序和后序代表的遍历顺序和处理逻辑的顺序如下:

前序遍历

public TreeNode pruneTree (TreeNode root) {

//前序

doSomeThing();

root.left =

pruneTree(root.left);

root.right

= pruneTree(root.right);

}

中序遍历

public TreeNode pruneTree (TreeNode root) {

root.left =

pruneTree(root.left);

//中序

doSomeThing();

root.right

= pruneTree(root.right);

}

后续遍历

public TreeNode pruneTree (TreeNode root) {

root.left =

pruneTree(root.left);

root.right

= pruneTree(root.right);

//后续

doSomeThing();

}

上面递归中不通的顺序就代表了不同的遍历顺序,同时代表了不同的实现,在二叉树遍历过程中要注意不同遍历顺序的要求。

二叉树剪枝_二叉树遍历与剪枝相关推荐

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

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

  2. java 二叉树特点_二叉树的Java实现及特点总结

    二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树: ...

  3. 对称二叉树c++_二叉树:我对称么?

    给「代码随想录」一个星标吧! ❝ 又是一道"简单题"? ❞ 101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的. 思路 「首先想清楚,判断对称二叉树要比较的是哪两个节点, ...

  4. 前序遍历二叉树代码_二叉树遍历、二叉树深度、代码示例,一点课堂(多岸学院)...

    二叉树的遍历 ★★★★★TreeNode 节点/ Definition for a binary tree node. /public class TreeNode {int val;TreeNode ...

  5. 广度优先遍历类似于二叉树的_深度优先遍历类似于二叉树的()

    (1)[◆题库问题◆]:[单选] 深度优先遍历类似于二叉树的() A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 [◆参考答案◆]:A ·ℳ°.·※°∴ ╰☆╮ .·ℳ°.·※°∴ ╰☆╮ . ...

  6. LeetCode 938. 二叉搜索树的范围和(二叉树遍历+搜索剪枝)

    文章目录 1. 题目 2. 解题 递归+剪枝 中序遍历循环+剪枝 1. 题目 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 题目的意思,节点的值在[L, R]这个区 ...

  7. 二叉树的基本操作_二叉树的遍历

    引入 前面讲到了二叉搜索树以及它的一些基本操作(插入,搜索,删除),可是我们要怎么知道这些操作已经被执行了呢?换句话说,怎样来描述二叉树的结构.这里我们又用到了遍历. 和图的遍历一样,我们也需要逐个访 ...

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

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

  9. 6-4 二叉树的非递归遍历 (25分)_本周小结!(二叉树)

    给「代码随想录」一个星标吧! ❝ 以后每周加上一个本周小结怎么样? ❞ 本周小结 发现大家周末的时候貌似都不在学习状态,周末的文章浏览量和打卡情况照工作日差很多呀,可能是本周日是工作日了,周六得好好放 ...

最新文章

  1. 终于找到可以一文多发的平台了!
  2. java中获取特定时间段_获取某一时间段特定星期几的所有日期(Java实现)
  3. C++跨类调用——extern
  4. 好架构是进化来的,不是设计来的
  5. 初探DispatcherServlet#doDispatch
  6. CodeForces - 1486E Paired Payment(分层图最短路)
  7. What day is that day?(快速幂,打表找周期,或者求通项公式)
  8. python的神经网络编程_Python神经网络编程 第二章 使用Python进行DIY
  9. 电商标识检测的鲁棒性防御,ACM MM2021 安全AI大赛技术解析
  10. Android开发BroadcastReceiver广播的使用
  11. vb调用python函数_vb.net / C# 调用 python
  12. 启明云端分享|IDO-SOM3022-V1.0:可适用于物联网等多个领域
  13. c语言程序规定必须用main作为,C语言学习必须清楚的事情,这就是C语言的开始...
  14. Spring Boot源码简析 @EnableTransactionManagement
  15. 协同过滤和关联规则分析的区别
  16. python爬取推特图片_twitter图片视频批量下载
  17. 办公技巧:如何修改PDF文件的日期格式
  18. 7.3_minibatch-sgd
  19. mi8se android9,小米小米 8SE(安卓9.0)刷机解锁教程,看教程秒懂刷机,亲测可用...
  20. Face Swapping under Large Pose Variations: a 3D Model Based Approach论文阅读笔记

热门文章

  1. 蓝桥算法提高ADV-381 分割项链题解
  2. BaseDao.java
  3. 西安的草根互联网要靠外力挽救吗?
  4. GPU渲染技术及性能优化
  5. hadoop添加snappy解压缩库
  6. 世界互联网大会展示前沿技术热议创新方向
  7. 计算机视觉 马尔_计算机视觉概述
  8. Linux基础入门教程
  9. 内联框架和音视频的播放
  10. 毕业设计-基于大数据的电影推荐系统-python