方法1:
この方法の適用条件:
1.ツリーをトラバースする場合、親ノードから子ノードを見つけるだけでよく、子ノードから親ノードを見つける必要はありません。
2.構築されたツリーは二分木です
実装コード:
class Tree{
int value;//代表该点的权值
int left_son;//左儿子编号
int right_son;//右儿子编号
int leftSide_value;//连接左儿子的边的权值
int rightSide_value;//连接右儿子边的权值
}
タイトルの説明に従って入力します。たとえば
、ノード番号、ノードの重み、左の息子の番号、右の息子の番号、および左の息子を右の息子のエッジの重みに接続するエッジの重みを入力します。
for(int i=1;i<=n;i++)//n代表节点的个数
{
num=sc.nextInt();
tree[num].value=sc.nextInt();
tree[num].left_son=sc.nextInt();
.......
}
方法2:
この方法の適用条件:
1.ツリーをトラバースする場合、親ノードから子ノードを見つけるだけでよく、子ノードから親ノードを見つける必要はありません。
2.この方法は、方法1の欠点の1つを補います。方法1は、複数の子ノードを持つツリーではなく、バイナリツリーに適しており、この方法は複数の子ノードを持つことができます。
実装コード:
void add(int a, int b){
//表示a为父 b为子
edge[cnt] = b;
ne[cnt] = last[a];
last[a] = cnt++;
}
このコードを見るのは少しめまいがするのではないかと思います。最初は私もそうでした。次の検索プロセスを見てください。
そのストレージ構造を調べています。入力順にノードをキューに入れます。そのようなものがあると仮定します。
入力の順序を表すツリー番号。ツリーの右側がどのように接続されているかを示します(cntは入力の順序を表し、実数ではありません。edge[cnt]は実数です)
だからあなたはクエリコードを得ることができます
for(int i=last[a];i>=1;i=ne[i])
継続的に更新されます!