C++二叉查找树的深度

本文探讨了如何使用递归算法计算C++中二叉查找树的深度。通过检查左子树和右子树的深度,确定整个树的最大深度,并在较大的深度基础上加1以考虑根节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法

采用递归的方法
1.如果左子树不为空,递归计算左子树的深度left
2.如果右子树不为空,递归计算右子树的深度right
3.比较left和right,树的深度为较大者+1(加上根结点)

代码

//计算整个树的深度
    int maxDepth(){
        return maxDepth(root);
    }

    //计算指定子树的深度
    int maxDepth(Node<Value>* x){
        int depth = 0;
        int left = 0;
        int right = 0;
        //计算左子树深度
        if(x->left != nullptr) left = maxDepth(x->left);
        //计算右子树深度
        if(x->right != nullptr) right = maxDepth(x->right);
        //比较左右子树的深度,较大者+1为整个子树的深度
        depth = left > right ? left + 1 : right + 1;
        return depth;
    }
### C++ 中二叉排序树的平均查找长度计算方法 对于二叉排序树(BST),其性能取决于树的高度。理想情况下,一棵平衡良好的二叉排序树可以提供接近 O(log n) 的时间复杂度;然而,在最坏的情况下(例如当输入序列已经有序时),这棵树可能会退化成链表形式,导致查找的时间复杂度变为 O(n)[^1]。 #### 平均查找长度 ASL 定义 平均查找长度(Average Search Length, ASL)是指在一个给定的关键码集合上执行成功或不成功的查找所需的比较次数之期望值。具体来说: - 成功查找的 ASL 是指在已存在的节点中找到目标所需经过路径上的边的数量加一; - 不成功查找的 ASL 则是在未命中情况下的预期访问节点数目。 #### 影响因素 影响 BST 上 ASL 主要的因素有两点:一是树形结构本身的好坏程度,二是待查元素分布特性。通常而言,随机构建出来的 BST 更倾向于保持较好的形态从而拥有较低的 ASL 值[^2]。 #### 计算公式 设 T 表示一颗含有 N 个内部结点的二叉搜索树,则该树的成功查找 ASL 可表示为如下公式: \[ \text{ASL}_{\text{success}}=\frac{\sum_{i=0}^{N}\left(d_i+1\right)}{N}, d_i \] 其中 \(d_i\) 表示第 i 个记录所在位置到根的距离(即深度)。而不成功查找 ASL 的表达式略有不同: \[ \text{ASL}_{\text{unsuccessful}}=\frac{(E_0+E_N)+2(E_1+\cdots + E_{N-1})}{N+1} \] 这里的 \(E_k\) 指的是从空子树 k 出发到达最近外部节点所经历过的内部分支总数加上一次额外探测操作[^3]。 ```cpp #include <iostream> using namespace std; struct TreeNode { int val; double depthSum; // 存储以当前节点为根的所有节点深度总和 int nodeCount; // 统计以当前节点为根的子树内的节点数量 TreeNode* left; TreeNode* right; TreeNode(int v):val(v),depthSum(0),nodeCount(1),left(nullptr),right(nullptr){} }; // 更新整棵二叉树的信息 void updateTreeInfo(TreeNode*& root){ if (!root || (!root->left && !root->right)) return ; updateTreeInfo(root->left); updateTreeInfo(root->right); int lDepth = root->left ? root->left->depthSum : 0; int rDepth = root->right ? root->right->depthSum : 0; int lNodes = root->left ? root->left->nodeCount : 0; int rNodes = root->right ? root->right->nodeCount : 0; root->depthSum += (lDepth + lNodes + rDepth + rNodes + 1); // 加入自己这一层贡献 root->nodeCount += lNodes + rNodes; } double calculateASLSuccessfulSearch(const TreeNode* root){ if(!root)return 0.; return root->depthSum / static_cast<double>(root->nodeCount); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值