二叉树剪枝_二叉树遍历与剪枝
目前工作中遇到如下问题,对象之间有依赖关系,抽象来看作一棵二叉树,最上层的是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();
}
上面递归中不通的顺序就代表了不同的遍历顺序,同时代表了不同的实现,在二叉树遍历过程中要注意不同遍历顺序的要求。
二叉树剪枝_二叉树遍历与剪枝相关推荐
- 广度优先遍历类似于二叉树的_二叉树的各种遍历方法的简单解释
二叉树顾名思义,最多两个孩子. 一般规定一个二叉树,因为节点间有相互连接的原因,所以只要给定根节点,那么顺着寻找左孩子和右孩子便可以遍历到所有的节点,这就是遍历的直观解释. 而遍历分为深度遍历和广度遍 ...
- java 二叉树特点_二叉树的Java实现及特点总结
二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树: ...
- 对称二叉树c++_二叉树:我对称么?
给「代码随想录」一个星标吧! ❝ 又是一道"简单题"? ❞ 101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的. 思路 「首先想清楚,判断对称二叉树要比较的是哪两个节点, ...
- 前序遍历二叉树代码_二叉树遍历、二叉树深度、代码示例,一点课堂(多岸学院)...
二叉树的遍历 ★★★★★TreeNode 节点/ Definition for a binary tree node. /public class TreeNode {int val;TreeNode ...
- 广度优先遍历类似于二叉树的_深度优先遍历类似于二叉树的()
(1)[◆题库问题◆]:[单选] 深度优先遍历类似于二叉树的() A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 [◆参考答案◆]:A ·ℳ°.·※°∴ ╰☆╮ .·ℳ°.·※°∴ ╰☆╮ . ...
- LeetCode 938. 二叉搜索树的范围和(二叉树遍历+搜索剪枝)
文章目录 1. 题目 2. 解题 递归+剪枝 中序遍历循环+剪枝 1. 题目 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 题目的意思,节点的值在[L, R]这个区 ...
- 二叉树的基本操作_二叉树的遍历
引入 前面讲到了二叉搜索树以及它的一些基本操作(插入,搜索,删除),可是我们要怎么知道这些操作已经被执行了呢?换句话说,怎样来描述二叉树的结构.这里我们又用到了遍历. 和图的遍历一样,我们也需要逐个访 ...
- java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...
1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...
- 6-4 二叉树的非递归遍历 (25分)_本周小结!(二叉树)
给「代码随想录」一个星标吧! ❝ 以后每周加上一个本周小结怎么样? ❞ 本周小结 发现大家周末的时候貌似都不在学习状态,周末的文章浏览量和打卡情况照工作日差很多呀,可能是本周日是工作日了,周六得好好放 ...
最新文章
- 终于找到可以一文多发的平台了!
- java中获取特定时间段_获取某一时间段特定星期几的所有日期(Java实现)
- C++跨类调用——extern
- 好架构是进化来的,不是设计来的
- 初探DispatcherServlet#doDispatch
- CodeForces - 1486E Paired Payment(分层图最短路)
- What day is that day?(快速幂,打表找周期,或者求通项公式)
- python的神经网络编程_Python神经网络编程 第二章 使用Python进行DIY
- 电商标识检测的鲁棒性防御,ACM MM2021 安全AI大赛技术解析
- Android开发BroadcastReceiver广播的使用
- vb调用python函数_vb.net / C# 调用 python
- 启明云端分享|IDO-SOM3022-V1.0:可适用于物联网等多个领域
- c语言程序规定必须用main作为,C语言学习必须清楚的事情,这就是C语言的开始...
- Spring Boot源码简析 @EnableTransactionManagement
- 协同过滤和关联规则分析的区别
- python爬取推特图片_twitter图片视频批量下载
- 办公技巧:如何修改PDF文件的日期格式
- 7.3_minibatch-sgd
- mi8se android9,小米小米 8SE(安卓9.0)刷机解锁教程,看教程秒懂刷机,亲测可用...
- Face Swapping under Large Pose Variations: a 3D Model Based Approach论文阅读笔记