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

C++二叉搜索树(BST)递归实现clone()深拷贝方法的相关问题

二叉搜索树clone方法实现方案

1. clone方法实现

clone的逻辑是递归完成深拷贝,终止条件为传入节点为空,否则新建节点后递归克隆左右子树:

Node* clone(Node* n) const
{
    // 递归终止:空节点直接返回空
    if (n == nullptr) {
        return nullptr;
    }
    // 新建节点,复制当前节点值
    Node* newNode = new Node(n->x);
    // 递归克隆左、右子树
    newNode->left = clone(n->left);
    newNode->right = clone(n->right);
    return newNode;
}

2. 拷贝构造函数修改

原有拷贝构造是浅拷贝,仅复制根节点指针,会导致两个树共用同一份节点内存,出现double free、修改互相影响的问题,修改为调用clone完成深拷贝:

Tree(const Tree &t) 
{
    root = clone(t.root);
}

3. 其他待实现方法参考

3.1 迭代查找

Node* find(int key)
{
    Node* cur = root;
    while (cur != nullptr) {
        if (cur->x == key) return cur;
        cur = key < cur->x ? cur->left : cur->right;
    }
    return nullptr;
}

3.2 递归查找

private: Node* find2(int key, Node* n)
{
    if (n == nullptr) return nullptr;
    if (n->x == key) return n;
    return key < n->x ? find2(key, n->left) : find2(key, n->right);
}

3.3 统计节点总数

private: int node_count(Node* n)
{
    if (n == nullptr) return 0;
    return 1 + node_count(n->left) + node_count(n->right);
}

3.4 计算最大深度

private: int depth(Node* n)
{
    if (n == nullptr) return 0;
    int left_depth = depth(n->left);
    int right_depth = depth(n->right);
    return 1 + (left_depth > right_depth ? left_depth : right_depth);
}

4. 已知bug修复

原有公有的前序、后序遍历方法错误调用了中序遍历,修改为:

public: void preOrder(){ preOrder(root); }
public: void postOrder(){ postOrder(root); }

内容的提问来源于stack exchange,提问作者user17138214

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:27:07