二叉搜索树区间求和的递归与迭代解法
需积分: 0 86 浏览量
更新于2024-08-05
收藏 184KB PDF 举报
"二叉搜索树的范围求和问题,提供了两种解法,分别是C语言的递归遍历和C++的借助栈迭代遍历。"
在计算机科学中,二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,其每个节点的值满足以下特性:
1. 左子树上所有节点的值均小于当前节点的值。
2. 右子树上所有节点的值均大于当前节点的值。
在给定的问题中,我们被要求找到一个二叉搜索树中值在[L, R](包括L和R)范围内的所有节点的和。由于二叉搜索树的特性,我们可以有效地进行范围求和操作。
方法一:C语言递归遍历
这个方法基于二叉搜索树的性质,通过递归的方式实现先序遍历。先序遍历的顺序是:根节点 -> 左子树 -> 右子树。在遍历过程中,如果当前节点的值在[L, R]范围内,则累加到结果中。对于不在范围内的节点,根据其值与范围的关系,递归地访问左子树或右子树。具体实现如下:
```c
void __preOrderTravel(struct TreeNode* node, int L, int R) {
if (node == NULL) return;
if (node->val < L) {
__preOrderTravel(node->right, L, R);
} else if (node->val > R) {
__preOrderTravel(node->left, L, R);
} else {
ret_val += node->val;
__preOrderTravel(node->left, L, R);
__preOrderTravel(node->right, L, R);
}
}
```
方法二:C++借助栈迭代遍历
迭代法主要利用了栈来模拟递归的过程,依然遵循先序遍历的顺序。首先将根节点压入栈中,然后在循环中不断处理栈顶元素,判断其值是否在[L, R]范围内。如果是,累加到结果中;若值小于L,将右子节点压入栈;若值大于R,将左子节点压入栈。代码如下:
```cpp
void preOrderTravel(TreeNode* root, int L, int R, int& ret_val) {
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
if (node == NULL) continue;
if (node->val < L) {
s.push(node->right);
} else if (node->val > R) {
s.push(node->left);
} else {
ret_val += node->val;
s.push(node->left);
s.push(node->right);
}
}
}
```
这两种方法都能有效地解决二叉搜索树中特定范围节点的求和问题,且时间复杂度都是O(n),n为树中的节点数。在实际应用中,迭代法通常比递归法更节省内存,因为它避免了函数调用的开销。然而,递归法的代码可能更简洁易懂。
2022-08-03 上传
2022-08-03 上传
2022-08-03 上传
2022-08-03 上传
2022-08-03 上传
2022-08-03 上传
2022-08-03 上传
2022-08-03 上传
2022-08-03 上传
yiyi分析亲密关系
- 粉丝: 32
- 资源: 321
最新资源
- 黑板风格计算机毕业答辩PPT模板下载
- CodeSandbox实现ListView快速创建指南
- Node.js脚本实现WXR文件到Postgres数据库帖子导入
- 清新简约创意三角毕业论文答辩PPT模板
- DISCORD-JS-CRUD:提升 Discord 机器人开发体验
- Node.js v4.3.2版本Linux ARM64平台运行时环境发布
- SQLight:C++11编写的轻量级MySQL客户端
- 计算机专业毕业论文答辩PPT模板
- Wireshark网络抓包工具的使用与数据包解析
- Wild Match Map: JavaScript中实现通配符映射与事件绑定
- 毕业答辩利器:蝶恋花毕业设计PPT模板
- Node.js深度解析:高性能Web服务器与实时应用构建
- 掌握深度图技术:游戏开发中的绚丽应用案例
- Dart语言的HTTP扩展包功能详解
- MoonMaker: 投资组合加固神器,助力$GME投资者登月
- 计算机毕业设计答辩PPT模板下载