树的高度

现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度

输入描述:

输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成,
下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号

输出描述:

输出树的高度,为一个整数
示例1

输入

5
0 1
0 2
1 3
1 4

输出

3
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cstdlib>
using namespace std;
int main()
{
    int n,H=1;
    int i=0;
    int f,c,h;
    vector<int>nodes(1000,0);//有效节点的高度
    nodes[0]=1;// 题目说了至少有一个节点,高度只是是1
    vector<int>childnum(1000,0);//记录节点的孩子数量
    cin>>n;
    while(--n)
    {
        cin>>f>>c;
        //父结点不存在,或者父节点已经有两个子结点就跳过
        if(nodes[f]==0||childnum[f]==2)
            continue;
        childnum[f]+=1;
        h=nodes[f]+1;
        nodes[c]=h;
        if(h>H)
            H=h;
    }
    cout<<H;
}

### 红黑高度特性 红黑是一种自平衡二叉搜索,其高度特性和计算方法与其严格的约束条件密切相关。以下是关于红黑最大高度公式的分析: #### 高度与黑色高度的关系 红黑的一个重要性质是:从根节点到任何一个叶子节点的路径上,黑色节点的数量相同,这一数量被称为**黑色高度**(black height, bh)[^3]。由于红黑中任意一条路径上的红色节点数最为黑色节点数减去1,因此整棵高度 \( h \) 受制于黑色高度 \( bh \),满足如下关系: \[ h \leq 2 \cdot bh(x) \] 这意味着红黑高度不会超过两倍的黑色高度。 #### 最大高度公式推导 为了进一步理解红黑的最大高度,可以通过以下方式来描述其下界和上界的范围。假设红黑中有 \( n \) 个内部节点,则根据红黑的性质可得: - 黑色高度为 \( bh \) 的子至少包含 \( 2^{bh} - 1 \) 个节点[^2]。 - 整体来看,如果一棵红黑具有 \( n \) 个节点,那么它的最小可能黑色高度大约为 \( \log_2 (n+1) / 2 \)。由此得出红黑的最大高度近似为: \[ h \approx 2 \cdot \lceil \log_2 (n+1) \rceil \] 此结论表明,在最坏情况下,红黑高度仍然保持在一个相对较低的范围内,具体取决于节点总数 \( n \) 和对数函数的增长速度。 ```python import math def max_height_red_black_tree(n): """ 计算红黑在给定节点数下的最大理论高度 """ return 2 * math.ceil(math.log2(n + 1)) # 示例调用 print(max_height_red_black_tree(15)) # 输出约为8 ``` 上述代码片段展示了如何基于输入参数 `n` 来估算红黑的最大高度。 --- ### 性质总结 除了以上提到的高度限制外,还需要注意以下几个方面: 1. **颜色交替规则**: 每个红色节点都必须有两个黑色孩子节点[^4]; 2. **全局有序性**: 所有的键值遵循标准二叉查找中的顺序排列原则[^5]。 这些额外的规定共同作用使得即使是在极端不平衡的情况下,红黑依然能够维持较好的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值