Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C++のmapで親ノードを取得する方法

解決したいこと

解決したいこと)
C++のmapで親ノードを取得する方法

具体的な問題

//n個の値が入力されます。これらの値を二分探索木にぶち込みます。後ろのn-1個の値の親ノードの値を出力せよ。そしてmapで実現せよ。

一行目は入力される値の数
二行目は入力される値の列

//input
5
3 1 5 2 4

         1(3)
       /     \
    2(1)      3(5)
       \      /   
       4(2) 5(4)

//output
3 3 1 5

普通の二分探索木での実現

#include<iostream>

using namespace std;

struct Node {
	int value;
	Node* left, * right;
};

Node* Insert(Node* node, int value, int father) {
	if (node == NULL) {
		node = new Node;
		if(father != -1) cout << father << endl;
		node->value = value;
		node->left = node->right = NULL;
	}
	if (value < node->value) {
		node->left = Insert(node->left, value, node->value);
	}
	else if (value > node->value) {
		node->right = Insert(node->right, value, node->value);
	}
	return node;
}

int main()
{
	int n, number;
	while (cin >> n) {
		Node* T = NULL;
		for (int i = 0; i < n; i++) {
			cin >> number;
			T = Insert(T, number, -1);
		}
	}
	return 0;
}


データ制限:
2≤n≤5×10^4
1≤ni≤2×10^9
時間制限:1s
データ制限:64MB





//小さいデータはこの方法でOKです、ただ仮にnが50000と大きい場合はTLEになります。


現在わかっていること

普通の二分探索木だとTLEになってしまいますので、赤黒木ベースのmapで実現する必要があります(←というヒントをもらってます、ただ使わなくてもよい)。
mapにデータをぶち込んでから、どうやってmapの中で親ノード値をゲットするのかわかりません。T T

0

2Answer

親ノードを作った直後に別ポインタでアドレスを保存したあと、値を入れていく処理を行えば良いのではないでしょうか?
保存しておいた別ポインタを参照すればいつでも親ノードに戻れますよね。

0Like

Comments

  1. シンプルにそうしたいのですが、AVL木や赤黒木ではない一般二分探索木で実現すると以下の状況でTLEになってしまいます。
    入力が増えていく場合
    例)1~50000を順番に入力した場合
    この場合にて、普通の二分探索木ですと、右下下がりのチェーンみたいな形になってしまうため、時間的にO(n^2)になってしまいます。。。

    出力は二分探索木の親ノードを出力、かつ実現はAVL木や赤黒木みたいなもっと早い方法を探しています。T T

あぁ、なるほど…
クラスのメンバの中に、親ノードへのポインタも追加で持たせておくとか!?
別途、リストor辞書を用意して全ノードへのポインタを並び順で格納しておくと、いつでもどこでも参照できそうですが、処理時間的にはやってみないとですね…

0Like

Comments

  1. そうですね...
    二分探索木ですと遅い、AVL木は多少早くなりますが、ノードの挿入の際調整が入るので、二分探索木の時の親ノードとまた違ってくる。。。行き詰ってます T T

Your answer might help someone💌