遍历二叉树
二叉树遍历
若将二叉树分为根节点,左子树,右子树三部分,则前中后序便对应根节点的访问次序。
1 前序遍历
先访问根节点,然后前序遍历左子树,再前序遍历右子树。
2 中序遍历
从根节点开始,先中序遍历左子树,然后访问根节点,再中序遍历右子树,整个访问次序为从左到右。
3 后序遍历
从根节点开始,从左到右,先叶子节点后中间节点的方式遍历左右子树,最后访问根节点。
4 层次遍历
从根节点开始访问,从上至下逐层遍历,同一层中,按由左到右的顺序遍历。
二叉树遍历算法实现
二叉树的前序、中序、后序、层级遍历的算法实现
@Slf4j
public class IterableTree {
/**
* 按照前序遍历二叉树
* @param binaryTree
*/
public void preOrder(BinaryTree binaryTree) {
if (Objects.isNull(binaryTree)) {
return;
}
log.info("node data is {}", binaryTree.data);
preOrder(binaryTree.leftNode);
preOrder(binaryTree.rightNode);
}
/**
* 按照中序遍历二叉树
* @param binaryTree
*/
public void midOrder(BinaryTree binaryTree) {
if (Objects.isNull(binaryTree)) {
return;
}
midOrder(binaryTree.leftNode);
log.info("node data is {}", binaryTree.data);
midOrder(binaryTree.rightNode);
}
/**
* 按照后序遍历二叉树
* @param binaryTree
*/
public void backOrder(BinaryTree binaryTree) {
if (Objects.isNull(binaryTree)) {
return;
}
backOrder(binaryTree.leftNode);
backOrder(binaryTree.rightNode);
log.info("node data is {}", binaryTree.data);
}
/**
* 按照层级遍历二叉树
* @param binaryTree
*/
public void deepOrder(BinaryTree binaryTree) {
if (Objects.isNull(binaryTree)) {
return;
}
int rootIndex = 1;
Map<Integer, List<BinaryTree>> deepTreeMap = Maps.newHashMap();
deepTreeMap.put(Integer.valueOf(rootIndex), Lists.newArrayList(binaryTree));
// 扁平化二叉树
for (int i = rootIndex; ;) {
List<BinaryTree> binaryTrees = deepTreeMap.get(Integer.valueOf(i)).stream().map(tree-> Lists.newArrayList(tree.leftNode, tree.rightNode))
.flatMap(List::stream).filter(Objects::nonNull).collect(Collectors.toList());
if (CollectionUtils.isEmpty(binaryTrees)) {
break;
}
i++;
deepTreeMap.put(Integer.valueOf(i), binaryTrees);
}
// 按由上至下,由左到右的顺序遍历
IntStream.rangeClosed(1, deepTreeMap.size()).forEach(index -> deepTreeMap.get(Integer.valueOf(index))
.forEach(tree -> log.info("node data is {}", tree.data)));
}
@Data
class BinaryTree<T>{
// root data
T data;
BinaryTree leftNode;
BinaryTree rightNode;
public BinaryTree(T data, BinaryTree left, BinaryTree right) {
this.data = data;
this.leftNode = left;
this.rightNode = right;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)