当前位置:网站首页>二叉树的常见算法总结
二叉树的常见算法总结
2020-11-06 01:18:00 【ClawHub的博客】
节点定义
1 |
public static class BinaryNode<T> { |
二叉树节点包括元素值与左右子节点引用。
创建节点
1 |
BinaryNode g = new BinaryNode(7); |
形如:
1、前、中、后序遍历
二叉树的前、中、后序遍历中的前、中、后指的是根节点;
前序:先输出根节点,之后左右节点。
中序:先左,之后输出根节点,再右。
后序:先左右,再输出根节点。
1 |
public static void visit(BinaryNode p) { |
1.1、前序遍历
1 |
根->左->右 |
1.1.1、递归实现
1 |
public static void recursivePreOrder(BinaryNode p) { |
如果节点为null,直接返回;
先打印出根节点,之后递归左子树,再递归右子树。
正好符合:先根,再左右。
1.1.2、非递归实现
1 |
public static void iterativePreOrder(BinaryNode p) { |
充分利用了栈的思路,先进后出。
当节点非空时,将节点入栈,迭代栈内元素,弹出栈顶元素,当前为根元素,之后将其右左子节点分别压栈。这样子节点出栈的顺序就是先左再右。
1.2、中序遍历
1 |
左->根->右 |
1.2.1、递归实现
1 |
public static void recursiveInOrder(BinaryNode p) { |
1.2.2、非递归实现
1 |
public static void iterativeInOrder(BinaryNode p) { |
1.3、后序遍历
1 |
左->右->根 |
1.3.1、递归实现
1 |
public static void recursivePostOrder(BinaryNode p) { |
1.3.2、非递归实现
1 |
public static void iterativePostOrder(BinaryNode p) { |
2、BFS与DFS
2.1、BFS广度优先搜索
1 |
1234567 |
广度优先遍历就是按层读取节点元素,需要借助队列的数据结构。
1 |
public static void levelOrderTraversal(BinaryNode node) { |
2.2、DFS深度优先搜索
1 |
1245367 |
从根节点出发,选择一条分支读取所有的元素,需要借助栈的数据结构。
1 |
public static void depthTraversal(BinaryNode node) { |
3、二叉树的深度
3.1、递归
1 |
private static int calcDepth(BinaryNode node) { |
3.2、深度优先
maxDepth与每个分支的长度做比较更新,最终获取最深的分支长度。
1 |
public static int maxDepthDFS(BinaryNode node) { |
3.3、广度优先
按层搜索,每进入一层,深度+1.
1 |
public static int maxDepthBFS(BinaryNode node) { |
4、二叉树镜像
通过深度或者广度遍历,将节点的左右子树交换。
1 |
public static void mirror(BinaryNode root) { |
5、对称二叉树
101. 对称二叉树
这道题就是二叉树镜像的变种,如果两个二叉树对称,则:
- 两个根节点具有相同的值
- 每个树的左子树,都与另一个树的右子树相同
递归实现:1
2
3
4
5
6
7
8
9
10
11public boolean isSymmetric(BinaryNode root) {
return isMirror(root, root);
}
public boolean isMirror(BinaryNode t1, BinaryNode t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
return (t1.val == t2.val)
&& isMirror(t1.right, t2.left)
&& isMirror(t1.left, t2.right);
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public boolean isSymmetric(BinaryNode root) {
LinkedList<BinaryNode> q = new LinkedList<>();
q.add(root);
q.add(root);
while (!q.isEmpty()) {
BinaryNode t1 = q.poll();
BinaryNode t2 = q.poll();
if (t1 == null && t2 == null) continue;
if (t1 == null || t2 == null) return false;
if (t1.val != t2.val) return false;
q.add(t1.left);
q.add(t2.right);
q.add(t1.right);
q.add(t2.left);
}
return true;
}
总结
二叉树的各种题目的算法在第一意识里会想到递归,但是递归深度过大时会出现栈溢出,所以相应的会使用迭代来实现,相应的也就引入队列或者栈的数据结构。
感觉最重要的算法就是DFS与BFS,其中DFS深度优先搜索使用栈的先进后出特性,而BFS广度优先搜索则使用队列的先进先出特性。
版权声明
本文为[ClawHub的博客]所创,转载请带上原文链接,感谢
https://clawhub.club/posts/2020/01/02/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B8%B8%E8%A7%81%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93/
边栏推荐
- 条码生成软件如何隐藏部分条码文字
- 7.3.1 file upload and zero XML registration interceptor
- 遞迴思想的巧妙理解
- Query意图识别分析
- [performance optimization] Nani? Memory overflow again?! It's time to sum up the wave!!
- 使用Asponse.Words處理Word模板
- 6.8 multipartresolver file upload parser (in-depth analysis of SSM and project practice)
- 免费的专利下载教程(知网、espacenet强强联合)
- 十二因子原则和云原生微服务 - DZone
- 企业数据库的选择通常由系统架构师主导决策 - thenewstack
猜你喜欢
随机推荐
Network programming NiO: Bio and NiO
Probabilistic linear regression with uncertain weights
Serilog原始碼解析——使用方法
JetCache埋点的骚操作,不服不行啊
如何将分布式锁封装的更优雅
Analysis of ThreadLocal principle
The practice of the architecture of Internet public opinion system
DTU连接经常遇到的问题有哪些
技術總監7年經驗,告訴大家,【拒絕】才是專業
python 保存list数据
DevOps是什么
nlp模型-bert从入门到精通(二)
A debate on whether flv should support hevc
3分钟读懂Wi-Fi 6于Wi-Fi 5的优势
TensorFlow2.0 问世,Pytorch还能否撼动老大哥地位?
车的换道检测
基于深度学习的推荐系统
直播预告 | 微服务架构学习系列直播第三期
读取、创建和运行多个文件的3个Python技巧
網路程式設計NIO:BIO和NIO