나무를 만드는 몇 가지 일반적인 방법

방법 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은 여러 자식 노드가있는 트리가 아닌 이진 트리에 적합하며이 방법은 여러 자식 노드를 가질 수 있습니다.

구현 코드 :

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])

지속적으로 업데이트됩니다!

추천

출처blog.csdn.net/jahup/article/details/108907953