在树形结构中,常见的搜索方式主要包括以下几种。以下是这些搜索方式的示例分享,旨在以简洁、高效的方式展示它们的实现逻辑。
### 1. 二叉树搜索
二叉树搜索是最基础也是最常用的树形搜索方式之一。在二叉树中,每个节点最多有两个子节点,通常称为左子节点和右子节点。搜索时,从根节点开始,根据目标值与节点值的比较结果决定向左子树还是右子树搜索,直至找到目标值或搜索到叶子节点为止。
**示例代码**(假设为二叉搜索树,即左子树所有节点值小于根节点值,右子树所有节点值大于根节点值):
#include <iostream>
using namespace std;
// 假设二叉树节点的定义如下
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 二叉树搜索函数
TreeNode* searchBST(TreeNode* root, int target) {
if (root == nullptr || root->val == target) {
return root;
}
if (target < root->val) {
return searchBST(root->left, target);
} else {
return searchBST(root->right, target);
}
}
int main() {
// 示例用法
TreeNode* root = new TreeNode(4);
root->left = new TreeNode(2);
root->right = new TreeNode(7);
root->left->left = new TreeNode(1);
root->left->right = new TreeNode(3);
root->right->left = new TreeNode(6);
root->right->right = new TreeNode(8);
int target = 3;
TreeNode* result = searchBST(root, target);
if (result != nullptr) {
cout << "Found: " << result->val << endl;
} else {
cout << "Not found." << endl;
}
// 释放内存(略)
return 0;
}
### 2. 满m叉树搜索
满m叉树是每一层节点都达到最大节点数的m叉树。搜索时,从根节点开始,依次遍历每一层的节点,直到找到目标值或遍历完所有节点。
**示例逻辑**(由于满m叉树的结构较为特殊,且具体实现可能依赖于具体的应用场景,此处仅描述逻辑):
- 从根节点开始,记录当前深度`depth`。
- 在当前深度下,遍历该层的所有节点(数量为m的`depth`次方)。
- 如果找到目标值,则返回该节点;否则,如果已遍历完当前层的所有节点且未达到树的最大深度,则`depth`加1,继续搜索下一层。
### 3. 子集树(全排列树)搜索
子集树(也称为全排列树)用于生成一个集合的所有子集或全排列。搜索时,通常使用深度优先搜索(DFS)来遍历所有可能的子集或排列。
**示例代码**(以生成集合的所有子集为例):
#include <iostream>
#include <vector>
using namespace std;
void generateSubsets(vector<int>& nums, int start, vector<int>& current, vector<vector<int>>& result) {
result.push_back(current); // 将当前子集加入结果集
for (int i = start; i < nums.size(); ++i) {
current.push_back(nums[i]); // 选择当前元素
generateSubsets(nums, i + 1, current, result); // 递归生成后续子集
current.pop_back(); // 回溯,撤销选择
}
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> result;
vector<int> current;
generateSubsets(nums, 0, current, result);
return result;
}
int main() {
vector<int> nums = {1, 2, 3};
vector<vector<int>> subsets = subsets(nums);
for (const auto& subset : subsets) {
for (int num : subset) {
cout << num << " ";
}
cout << endl;
}
return 0;
}
以上示例展示了树形结构中三种