当前位置:网站首页>二叉树的常见算法总结
二叉树的常见算法总结
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/
边栏推荐
猜你喜欢
随机推荐
大数据应用的重要性体现在方方面面
6.7 theme resolver theme style parser (in-depth analysis of SSM and project practice)
JetCache埋点的骚操作,不服不行啊
网络安全工程师演示:原来***是这样获取你的计算机管理员权限的!【维持】
Every day we say we need to do performance optimization. What are we optimizing?
【新閣教育】窮學上位機系列——搭建STEP7模擬環境
Didi elasticsearch cluster cross version upgrade and platform reconfiguration
How to get started with new HTML5 (2)
免费的专利下载教程(知网、espacenet强强联合)
使用Asponse.Words處理Word模板
使用NLP和ML来提取和构造Web数据
Why do private enterprises do party building? ——Special subject study of geek state holding Party branch
Microservices: how to solve the problem of link tracing
接口压力测试:Siege压测安装、使用和说明
給萌新HTML5 入門指南(二)
【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
一时技痒,撸了个动态线程池,源码放Github了
如何在Windows Server 2012及更高版本中將域控制器降級
Probabilistic linear regression with uncertain weights
DevOps是什么







