당신이 보여주는 그림은 그 접근법이 끝에서부터 작동해야한다는 것을 암시합니다. 먼저, 자식이없는 노드 (이 경우에는 8과 7)를 찾습니다. 트리의 "이중 트렁크"를 형성합니다. 그런 다음 8과 7의 부모를 모두 찾으십시오. 부모가없는 모듈을 찾으십시오.이 경우 1. 이것을 조상이라고 부릅니다. 그것은 "끝점"입니다. 마지막으로 공통 노드 집합마다 "패밀리"를 선언합니다. 공통 노드를 가진 노드는 같은 노드가 둘 이상의 패밀리에 속할 수있는 경우에도 패밀리입니다. 부모가 하나 뿐인 노드는 해당 부모의 가족 중 일부입니다.
8를 들어, 당신은 찾을 수 5, 6 가족 A.
7의 경우, 4 가족 B. 7 단 하나의 부모가, 그래서 우리는 가족 B.
전화의 네 부분으로 전화를 찾을 수
이 "세대 2".
2 세대의 경우 부모를 찾습니다.
패밀리 A : 5 -> 2,3,4. 가족 C 6 -> 3,4. 패밀리 D
패밀리 B : 4 -> 1 - 확장 된 패밀리가 조상에 이릅니다. 이 경로는 이제 완료되었습니다. > 1 - 2 : 5 (가족 C)의
: 우리는 1-4-7 엔드 (모든 "가족 B")
이제 3 세대의 부모를 보면 하나 개의 경로를 캡처 할 수 있습니다 3 -> 1 4 -> 1 같은 부모의 같은 가족 구성원은 '가까운 형제 자매'이고 위와 아래의 <flow>
이됩니다. 6 (가족 D)의
: 3 -> 1 4 -> 1 또 다른 가까운 가족
그리고이 가족 모두가 조상을 가리키는 결국 때문에, 우리가 서로를해야합니다
.
따라서 우리는 설명 된 모든 프로세스의 완전한 조상을 가지고 있습니다. 이제 위의 "패밀리"를 사용하여 플로우 맵으로 변환합니다.
Your desired XML - annotated with the families. You can see how this works
<root>
<seq>
<mod1/> // the ancestor
<flow>
<seq> // family B - straight through.
<mod4/>
<mod7/>
</seq>
<seq>
<flow>
<seq>
<flow> // close family D
<mod4/>
<mod3/>
</flow>
<mod6/> // child of D
</seq>
<seq>
<flow> // close family C
<mod4/>
<mod3/>
<mod2/>
</flow>
<mod5/> // child of C
</seq>
</flow>
<mod8/>
</seq>
</flow>
</seq>
</root>
이 도움이 되었습니까, 아니면 완전히 해제 되었습니까?
편집 : "중간에 폐쇄 흐름"의 주제에, 다음과 같은 생각 :
가족이 다른 가족과 같은 (그랜드) 아이가, 그들은 같은 (그랜드) 부모가있는 경우
, 그들의 흐름은 그 수준에서 결합 될 수 있습니다. 이를 발견하려면 각 가족과 함께 "직계"목록을 유지해야하며이 목록을 반복적으로 검색하여 모든 가족이 공통 (웅대 한) 부모와 공통 (웅대 한) 자녀가있는 경우를 찾아야합니다. 일반적인 방법으로이를 통해 작업하기 내가 오늘 밤에 투입 할 수있는 것보다 조금 더 많은 노력을 할 것이다, 당신은 당신이 솔루션에 가까운 표시했기 때문에 내가 마지막으로 ... 여기
이것은 그리드처럼 보이지 않습니다. 그래프처럼 보입니다. 그러나주기가있는 것처럼 나무로 표현할 수는 없습니다. –
죄송합니다, 당신이 맞습니다 @ IvayloStrandjev, 방금 내 질문을 편집했습니다. – eskalera
산문에서 원하는 것을 설명해 주시겠습니까? –