演習4.5順次保存された二分木の最も近い共通祖先問題(25ポイント)

順次格納されるバイナリツリーにiとjの番号が付けられた2つのノードがあると仮定して、それらの最も近い共通の祖先ノードの数と値を見つけるアルゴリズムを設計してください。

入力形式:
最初の行を入力して、順次ストレージの最大容量である正の整数n(≤1000)を指定します。2番目の行を入力して、スペースで区切られたn個の非負の整数を指定します。ここで、0はバイナリツリーの空のノードを表します(最初のノードが0の場合、空のツリーを表します)。3番目の行はノード番号iとjのペアを示します。

入力が二分木に正しく対応し、1≤i、j≤nであることを確認してください。

出力フォーマット:
IまたはJに相当する空のノードに、出力場合T [X]がNULLである:ERROR xはエラーが最初に発見されたIまたはJの数であり、そうでない場合、出力番号がiおよびj一行ザで2つのノードの最も近い共通の祖先ノードの数と値はスペースで区切られます。

ここに画像の説明を挿入します

ここに画像の説明を挿入します

質問のアイデア:

二分木の各ノード(ルートノードを除く)の親ノードの添え字は、i / 2として順次格納されます。コードをアップロード

#include<iostream>
using namespace std;

int main()
{
    
    
	int ar[1001] = {
    
    0};
	int n;
	cin >> n; 
	for (int i = 1; i <= n; i++)
		cin >> ar[i];
	int a, b;
	cin >> a >> b;
	if (!ar[a]) 	
		printf("ERROR: T[%d] is NULL", a);
	else if (!ar[b])  
	  	printf("ERROR: T[%d] is NULL", b);
	else
	{
    
    
		while (a != b)
		{
    
    
			if (a > b) a /= 2;
			else b /= 2;
		}
		cout << a << " " << ar[a];
	}
    return 0;
}

おすすめ

転載: blog.csdn.net/xdg15294969271/article/details/113953327