当前位置:网站首页>二叉树的常见算法总结
二叉树的常见算法总结
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/
边栏推荐
- 快快使用ModelArts,零基础小白也能玩转AI!
- 自然语言处理之命名实体识别-tanfordcorenlp-NER(一)
- 谁说Cat不能做链路跟踪的,给我站出来
- Polkadot series (2) -- detailed explanation of mixed consensus
- nlp模型-bert从入门到精通(二)
- 《Google軟體測試之道》 第一章google軟體測試介紹
- c++学习之路:从入门到精通
- 【Flutter 實戰】pubspec.yaml 配置檔案詳解
- Pattern matching: The gestalt approach一种序列的文本相似度方法
- WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
猜你喜欢
How to demote a domain controller in Windows Server 2012 and later
Technical director, to just graduated programmers a word - do a good job in small things, can achieve great things
PPT画成这样,述职答辩还能过吗?
如何对Pandas DataFrame进行自定义排序
自然语言处理-搜索中常用的bm25
Python自动化测试学习哪些知识?
接口压力测试:Siege压测安装、使用和说明
什么是无副作用的函数方法?如何取名? - Mario
嘘!异步事件这样用真的好么?
条码生成软件如何隐藏部分条码文字
随机推荐
【Flutter 實戰】pubspec.yaml 配置檔案詳解
如何将数据变成资产?吸引数据科学家
Asp.Net Core learning notes: Introduction
向北京集结!OpenI/O 2020启智开发者大会进入倒计时
什么是无副作用的函数方法?如何取名? - Mario
Asp.Net Core學習筆記:入門篇
Polkadot series (2) -- detailed explanation of mixed consensus
GBDT与xgb区别,以及梯度下降法和牛顿法的数学推导
一时技痒,撸了个动态线程池,源码放Github了
Menu permission control configuration of hub plug-in for azure Devops extension
Clean架构能够解决哪些问题? - jbogard
利用 AWS SageMaker BlazingText 对不均衡文本进行多分类
Dapr實現分散式有狀態服務的細節
Basic principle and application of iptables
谁说Cat不能做链路跟踪的,给我站出来
[译] 5个Vuex插件,给你的下个VueJS项目
使用Asponse.Words處理Word模板
Network programming NiO: Bio and NiO
Pattern matching: The gestalt approach一种序列的文本相似度方法
Cos start source code and creator