이전 기사에서, 나는 재귀 트래버스 달력 알고리즘 (바이너리 트리 첫 루트 (첫 번째 시퀀스) 트래버스 (Traversal)는 주로 이진 트리의 비 재구성 알고리즘에 대해 스택 구조를 채택한다고 말했다.
첫 번째 트래버스의 비 재전송 알고리즘을 요약하십시오.
1) 스택을 입력하고 주로 스택 첫 번째 노드를 입력 한 다음이 노드를 방문하십시오.
2)
3) IF 노드의 오른쪽 자식은 TRUE입니다. 1) 계속 통과하십시오. 그렇지 않으면 현재 노드가 종료되어 부모 노드로 전송됩니다 1)
먼저이 아이디어를 준수하는 알고리즘을 살펴보십시오.
다음과 같이 코드 코드를 복사하십시오.
int preordertraversenonrcursiveEx (const bitree & t, int (*visitnode) (TelemType Data))
{{
if (t == null)
{{
반품 -1;
}
Bitnode *pbinode = t;
sqstack s;
이니 스택 (& s);
푸시 (& s, (selectype) t);
while (! isstackedy (s))
{{
while (pbinode)
{{
VisitNode (pbinode-> data);
if (pbinode! = t)
{{
push (& s, (selectype) pbinode);
}
pbinode = pbinode-> lchild;
}
if (pbinode == null)
{{
팝 (& s, (selemtype*) & pbinode);
}
if (pbinode-> rchild == null)
{{
팝 (& s, (selemtype*) & pbinode);
}
pbinode = pbinode-> rchild;
}
반환 0;
}
참고 : 1) 스택 구조는 여기에서 사용되며 위의 구조 순서대로 저장된 스택을 볼 수 있습니다.
2) 여기에 노드를 저장할 때, 내가 저장하는 것은 포인터의 주소, 즉 노드의 주소이며, 포인터는 팝에 사용되므로 & pbinode는 pbinode 대신에 가져옵니다. . 왜 포인터를 사용하는 것이 Bitnode *pbinode를 이해하는 것이 가장 좋습니다.
위의 알고리즘은 실제로 잘못되었습니다! 왜? 여기서 나는 오랫동안 무한 사이클이 나타 났으며, 결국 왼쪽 나무에서 샷 트리가 없었습니다. 팝 후에는 스택이 비어 있지만 여전히 올바른 나무가 있으면 계속해서 검증되지 않았습니다 다음과 같이 왼쪽 자식 나무가 비어있는 경우 : 다음과 같이 :
다음과 같이 코드 코드를 복사하십시오.
int preordertraversenonrcursive (const bitree & t, int (*visitnode) (TelemType Data))
{{
if (t == null)
{{
반품 -1;
}
Bitnode *pbinode = t;
sqstack s;
이니 스택 (& s);
푸시 (& s, (selectype) t);
while (! isstackedy (s))
{{
getTop (s, (selectype*) & pbinode);
while (pbinode)
{{
VisitNode (pbinode-> data);
pbinode = pbinode-> lchild;
push (& s, (selectype) pbinode);
}
if (pbinode == null)
{{
팝 (& s, (selemtype*) & pbinode);
}
if (! isstackedy (s))
{{
팝 (& s, (selemtype*) & pbinode);
pbinode = pbinode-> rchild;
push (& s, (selectype) pbinode);
}
}
반환 0;
}
그렇습니다. 먼저 루트 노드를 누른 다음 왼쪽 하위 트리가 비어 있는지 확인한 다음 비어 있지 않은 스택이 부모 노드를 가져 오면 오른쪽 자식을 판단하십시오. 오른쪽 하위 노드로 누른 다음 오른쪽 나무의 왼쪽 자식이 비어 있는지 확인하고 사이클을 계속하십시오.
여기에는 두 개의 폐기물이 있습니다. 하나는 빈 아이의 노드를 밀어서 스택에 들어가고 다른 하나는 자주 gettop을 사용하여 스택의 상단 요소를 얻는 것입니다.
여기로 돌아와서 NULL 노드가 Null 포인터 또는 빈 자식으로 누르지 않는 알고리즘을 확인하십시오 NULL은 NULL이므로 오른쪽 하위 트리의 노드를 표시하지 않는 당혹감이 없습니다. 다음과 같이.
다음과 같이 코드 코드를 복사하십시오.
// 이진 트리가 비전적으로 가로 지르고 있습니다
int preordertraversenonrcursiveEx (const bitree & t,
int (*visitnode) (TelemType Data))
{{
if (t == null)
{{
반품 -1;
}
Bitnode *pbinode = t;
sqstack s;
이니 스택 (& s);
푸시 (& s, (selectype) t);
while (! isstackedy (s) || pbinode) // 주요 수정은이 문장입니다.
{{
while (pbinode)
{{
VisitNode (pbinode-> data);
if (pbinode! = t)
{{
push (& s, (selectype) pbinode);
}
pbinode = pbinode-> lchild;
}
if (pbinode == null)
{{
팝 (& s, (selemtype*) & pbinode);
}
if (pbinode-> rchild == null)
{{
팝 (& s, (selemtype*) & pbinode);
}
pbinode = pbinode-> rchild;
}
반환 0;
}
첫 번째 루프가 추가되면 테스트 케이스로 충분합니다. 다음과 같이 이전 섹션에서 이진 트리를 테스트하십시오.
현재 입력 데이터는 여전히 12 34 0 78 0 0입니다. 테스트 결과는 다음과 같습니다.
--- bitree ---
Bitree 노드 데이터를 입력하십시오.
12
Bitree 노드 데이터를 입력하십시오.
34
Bitree 노드 데이터를 입력하십시오.
0
Bitree 노드 데이터를 입력하십시오.
0
Bitree 노드 데이터를 입력하십시오.
78
Bitree 노드 데이터를 입력하십시오.
0
Bitree 노드 데이터를 입력하십시오.
0
12 34 78
테스트하기에 충분하지 않습니다. 다음 바이너리 트리를보십시오.
현재 입력 데이터는 다음과 같습니다. 12 34 24 0 0 0 0 0 78 37 0 0 0. 테스트 결과는 다음과 같습니다.
--- bitree ---
Bitree 노드 데이터를 입력하십시오.
12
Bitree 노드 데이터를 입력하십시오.
34
Bitree 노드 데이터를 입력하십시오.
24
Bitree 노드 데이터를 입력하십시오.
0
Bitree 노드 데이터를 입력하십시오.
0
Bitree 노드 데이터를 입력하십시오.
50
Bitree 노드 데이터를 입력하십시오.
0
Bitree 노드 데이터를 입력하십시오.
0
Bitree 노드 데이터를 입력하십시오.
78
Bitree 노드 데이터를 입력하십시오.
37
Bitree 노드 데이터를 입력하십시오.
0
Bitree 노드 데이터를 입력하십시오.
0
Bitree 노드 데이터를 입력하십시오.
0
12 34 24 50 78 37
예비 트래버스 에서도이 알고리즘은 서문에 의해 트래버스됩니다. 그런 다음 그것을 추가하여 적합한 위치에 합류하십시오