二叉树的遍历和查找
前序遍历
若二叉树非空,则执行以下操作:
- 访问根结点;
- 先序遍历左子树;
- 先序遍历右子树
中序遍历
若二叉树非空,则执行以下操作:
- 中序遍历左子树;
- 访问根结点;
- 中序遍历右子树。
后序遍历
若二叉树非空,则执行以下操作:
- 后序遍历左子树;
- 后序遍历右子树;
- 访问根结点
实例说明
对于上面的二叉树而言,
- 前序遍历结果: 3 1 2 5 4 6
- 中序遍历结果: 1 2 3 4 5 6
- 后序遍历结果: 2 1 4 6 5 3
树的遍历代码实现
定义一个树结构
@ToString
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
定义一个遍历方式的枚举
/**
* 遍历的方向.
*/
enum Direct {
/**
* 中序
*/
middle,
/**
* 前序
*/
before,
/**
* 后序
*/
after;
}
实现代码
/**
* 遍历.
*/
public void print(Direct direct) {
StringBuffer stringBuffer = new StringBuffer();
print(stringBuffer, this, direct, "ROOT:");
System.out.println(stringBuffer.toString());
}
private void print(StringBuffer stringBuffer, TreeNode treeNode, Direct direct, String node) {
if (treeNode != null) {
if (direct == Direct.before) {
stringBuffer.append(node + treeNode.val + "\n");
print(stringBuffer, treeNode.left, direct, "L:");
print(stringBuffer, treeNode.right, direct, "R:");
} else if (direct == Direct.middle) {
print(stringBuffer, treeNode.left, direct, "L:");
stringBuffer.append(node + treeNode.val + "\n");
print(stringBuffer, treeNode.right, direct, "R:");
} else {
print(stringBuffer, treeNode.left, direct, "L:");
print(stringBuffer, treeNode.right, direct, "R:");
stringBuffer.append(node + treeNode.val + "\n");
}
}
}
二叉查询树实现了二分查找法
时间复杂度是Olog(n)到O(n),也就是说它最好的情况是Olog(n),当然运气不好,也就是你查询的是叶子节点,那就是O(n)了。
/*
* 二分查找,最优时间复杂度OLog(n).
*/
private TreeNode search(TreeNode x, int key) {
if (x == null)
return x;
int cmp = key - x.val;
if (cmp < 0)
return search(x.left, key);
else if (cmp > 0)
return search(x.right, key);
else
return x;
}
public TreeNode search(int key) {
return search(this, key);
}
}
对于树的知识还有很多,本文章主要介绍树的遍历和查找!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2017-05-31 Linux~Sh脚本一点自己的总结
2016-05-31 DotNetCore跨平台~Startup类的介绍
2012-05-31 架构,改善程序复用性的设计~第四讲 方法的重载真的用不到吗?
2011-05-31 项目中的通用消息类的实现