当前位置:网站首页>二叉树的常见算法总结
二叉树的常见算法总结
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/
边栏推荐
猜你喜欢
怎么理解Python迭代器与生成器?
mac 下常用快捷键,mac启动ftp
Elasticsearch database | elasticsearch-7.5.0 application construction
简直骚操作,ThreadLocal还能当缓存用
Want to do read-write separation, give you some small experience
选择站群服务器的有哪些标准呢?
大数据应用的重要性体现在方方面面
Pattern matching: The gestalt approach一种序列的文本相似度方法
哇,ElasticSearch多字段权重排序居然可以这么玩
【新閣教育】窮學上位機系列——搭建STEP7模擬環境
随机推荐
Elasticsearch database | elasticsearch-7.5.0 application construction
給萌新HTML5 入門指南(二)
GBDT与xgb区别,以及梯度下降法和牛顿法的数学推导
Dapr實現分散式有狀態服務的細節
Why do private enterprises do party building? ——Special subject study of geek state holding Party branch
中国提出的AI方法影响越来越大,天大等从大量文献中挖掘AI发展规律
Vue.js移动端左滑删除组件
【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
条码生成软件如何隐藏部分条码文字
Basic principle and application of iptables
快快使用ModelArts,零基础小白也能玩转AI!
不吹不黑,跨平臺框架AspNetCore開發實踐雜談
用Keras LSTM构建编码器-解码器模型
windows10 tensorflow(二)原理实战之回归分析,深度学习框架(梯度下降法求解回归参数)
Microservices: how to solve the problem of link tracing
遞迴思想的巧妙理解
用Python构建和可视化决策树
keras model.compile损失函数与优化器
如何成为数据科学家? - kdnuggets
被老程式設計師壓榨怎麼辦?我不想辭職