请求实现含非递归插入的二叉搜索树类及中序转vector功能
实现满足需求的二叉搜索树类
没问题,我来帮你实现这个符合要求的二叉搜索树(BST)类。下面是完整的C++代码实现,每个成员函数都附带详细的解释:
#include <vector> #include <stack> // 用于非递归中序遍历(可选) class BST { private: // 二叉搜索树的节点结构体 struct Node { double val; Node* left; Node* right; Node(double x) : val(x), left(nullptr), right(nullptr) {} }; Node* root; public: // 构造函数 BST() : root(nullptr) {} // 析构函数(可选,用于释放内存,避免内存泄漏) ~BST() { destroyTree(root); } // 插入元素,*非递归实现*(完全符合要求) void insert(double x) { Node* newNode = new Node(x); // 如果树为空,直接作为根节点 if (root == nullptr) { root = newNode; return; } Node* current = root; Node* parent = nullptr; // 循环找到插入位置,全程无递归 while (current != nullptr) { parent = current; if (x < current->val) { current = current->left; } else { current = current->right; } } // 根据大小关系挂载新节点到父节点的左/右子树 if (x < parent->val) { parent->left = newNode; } else { parent->right = newNode; } } // 搜索元素,非递归实现 bool search(double x) { Node* current = root; while (current != nullptr) { if (x == current->val) { return true; } else if (x < current->val) { current = current->left; } else { current = current->right; } } return false; } // 中序遍历,将元素存入vector(递归版本,代码简洁) void inorder(vector<double>& v) { inorderHelper(root, v); } // 可选:*非递归版本的中序遍历*(适合需要避免递归的场景) void inorderNonRecursive(vector<double>& v) { if (root == nullptr) return; std::stack<Node*> s; Node* current = root; while (current != nullptr || !s.empty()) { // 先遍历到当前分支的最左节点 while (current != nullptr) { s.push(current); current = current->left; } current = s.top(); s.pop(); v.push_back(current->val); // 处理右子树 current = current->right; } } private: // 递归中序遍历的辅助函数 void inorderHelper(Node* node, vector<double>& v) { if (node == nullptr) return; inorderHelper(node->left, v); v.push_back(node->val); inorderHelper(node->right, v); } // 析构函数的辅助函数,递归释放所有节点内存 void destroyTree(Node* node) { if (node == nullptr) return; destroyTree(node->left); destroyTree(node->right); delete node; } };
关键成员函数详解
1. void insert(double x)
这是核心要求的非递归插入:
- 首先创建新节点,判断树是否为空,为空则直接将新节点设为根。
- 用
current和parent两个指针循环遍历树,找到新节点的父节点:- 插入值小于当前节点值时,向左子树移动;否则向右。
- 最后根据值的大小,将新节点挂到父节点的左或右子节点上,全程没有调用任何递归函数,完全符合要求。
2. bool search(double x)
- 从根节点开始遍历,每次对比目标值和当前节点值:
- 相等则直接返回
true; - 目标值更小则往左子树继续找;更大则往右子树找;
- 遍历到空节点还没找到,就返回
false。
- 相等则直接返回
- 这里用的是非递归实现,效率很高,你也可以改成递归版本(如果需要的话)。
3. void inorder(vector<double> &v)
提供了两种实现方式,都能保证将BST元素按升序存入vector(因为BST的中序遍历结果天然有序):
- 递归版本:通过辅助函数
inorderHelper,先递归遍历左子树,再存入当前节点值,最后遍历右子树,写法非常简洁直观。 - 非递归版本(可选):利用栈模拟递归调用的过程,手动管理遍历顺序,适合对递归深度有顾虑的场景。
使用示例
你可以参考下面的代码来使用这个BST类:
#include <iostream> int main() { BST tree; // 插入测试数据 tree.insert(5.0); tree.insert(3.0); tree.insert(7.0); tree.insert(2.0); tree.insert(4.0); // 测试搜索功能 std::cout << "Search for 4.0: " << (tree.search(4.0) ? "Found" : "Not found") << std::endl; std::cout << "Search for 6.0: " << (tree.search(6.0) ? "Found" : "Not found") << std::endl; // 测试中序遍历 std::vector<double> result; tree.inorder(result); std::cout << "Inorder traversal result: "; for (double num : result) { std::cout << num << " "; } // 输出结果:2.0 3.0 4.0 5.0 7.0 return 0; }
内容的提问来源于stack exchange,提问作者Kenneth Freeman
相关产品推荐
相关产品推荐

