You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求实现含非递归插入的二叉搜索树类及中序转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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:59:54