1.前言
各种算法层出不穷,又彼此联系,在如此纷繁复杂的算法学习路上,哪里是尽头。在我看来,纠结此类抽象问题,一定得使用抽象思维去破解,去找到问题的源头,也就是常说的框架。框架就是方向,方向对了,你总可以把题目搞出来。数据结构一共就两种框架,数组和链表。「树」,⽤数组实现就是「堆」,因为「堆」是⼀个完全⼆叉树,⽤数组存储不需要节点指针,操作也⽐较简单;⽤链表实现就是很常⻅的那种 「树」,因为不⼀定是完全⼆叉树,所以不适合⽤数组存储。为此,在这种 链表「树」结构之上,⼜衍⽣出各种巧妙的设计,⽐如⼆叉搜索树、AVL 树、红⿊树、区间树、B 树等等,以应对不同的问题。不废话了,今天就水一篇二叉搜索树。
2.模板
二叉树结构
class BTree {
int val;
BTree left;
BTree right;
public BTree(int val){this.val = val;}
}
构建,基于链表,可以看我另外一篇数据结构-链表。
遍历 (BFS + DFS)
BFS例题:
题目:之字型遍历二叉树:
请实现一个函数按照之字形顺序从上向下打印二叉树。
即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]
8
/ \
12 2
/ \
6 4
输出:[[8], [2, 12], [6, 4]]
实现:
class Solution {
public List<List<Integer>> printFromTopToBottom(TreeNode root) {
List<List<Integer>> list = new ArrayList();
boolean tag = true;
LinkedList<TreeNode> q = new LinkedList();
if (root == null) {
return list;
}
q.add(root);
while (q.size() > 0) {
int size = q.size();
List<Integer> temp = new ArrayList<>();
while (size-- > 0) {
TreeNode h = q.poll();
if(tag) {
temp.add(h.val);
}else {
temp.add(0,h.val);
}
if (h.left != null) q.add(h.left);
if (h.right != null) q.add(h.right);
}
list.add(temp);
tag = !tag;
}
return list;
}
}
BFS模板
while(!q.isEmpty()) {
取出对头
操作
入队
}
DFS
输入一棵二叉树的根结点,求该树的深度。
从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示:
8
/ \
12 2
/ \
6 4
输出:3
class Solution {
public int treeDepth(TreeNode root) {
if (root == null) return 0;
return Math.max(treeDepth(root.left),treeDepth(root.right)) + 1;
}
}
3.使用
需要一层一层的模拟,使用bfs,若只需要得到某个最值或是某一个节点dfs
作者:万能包哥 出处:http://www.cnblogs.com/mybloger/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异