浙大版《数据结构(第2版)》题目集-习题 4.5

习题4.5 顺序存储的二叉树的最近的公共祖先问题 (25point(s))

设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。

Example:

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

#define CHECK(x) if(H[x]==0) {printf("ERROR: T[%d] is NULL\n", x);return 0;}
#define MARK(x)  {int h=x;while(h){V[h]+=1;h>>=1;}}

int main()
{
    int N;
    cin >> N;
    vector<int> H;
    vector<int> V;
    H.reserve(N+1);
    V.reserve(N+1);
    for(int k = 1; k <= N; k++) {
        cin >> H[k];
        V[k] = 0;
    }
    int i, j;
    cin >> i >> j;
    CHECK(i);
    CHECK(j);
    MARK(i);
    MARK(j)
    while(i) {
        if(V[i] == 2) { cout << i << ' ' << H[i] << endl; break;}
        i >>= 1;
    }
    return 0;
}

思路:

标记 i,j 到根结点的路径,然后在从i或者j开始重新检查路径,如果某个结点被标记2次,那么这个就是共同祖先

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值