Post -Order는 Post -Order의 포인터를 보유하고 있다면 추가 정보는 충분하지 않습니다 스택에 저장됩니다.
많은 방법이 있습니다. 여기에 하나만 제공되며 먼저 스택 노드의 데이터 구조를 정의하십시오.
다음과 같이 코드 코드를 복사하십시오.
typedef struct {node * p;} snode // 이진 트리의 노드 구조는 P에 의해 지적 된 노드의 오른쪽 노드가 액세스되었음을 의미합니다.
LastOrderTraverse (bitree bt) {
// 먼저 루트 노드에서 시작하여 왼쪽 하단으로 이동하여 헤드로 이동하여 각 노드를 스택으로 입력하십시오.
p = bt;
while (bt)
푸시 (bt, 0);
Bt = Bt.lchild;
}
// 그런 다음 사이클 본체를 입력하십시오
while (! stack.empty ()) {// 스택이 비어 있지 않은 한
sn = stack.getTop (); // sn은 스택의 상단 노드입니다
// NODE N은 왼쪽 자식이있는 한, N 스택에 들어간 후 N의 왼쪽 자식은 스택을 따라야합니다 (이것은 알고리즘의 후반에 반영 됨). 쌓을 때 상단 요소 일 때이 요소에 남은 자녀가 없거나 왼쪽 자녀가 접근했음을 확신 할 수 있습니다. 따라서 현재 우리는 왼쪽 자녀를 신경 쓰지 않으며 오른쪽 자녀에 대해서만 관심이 있습니다.
// 올바른 자식에 액세스하거나 요소에 올바른 자식이없는 경우, 이시기에는 사정 횡단의 정의가 이동할 수 있습니다.
if (! sn.p.rchild || sn.rvisited) {{
p = pop ();
방문 (p);
}
else // 올바른 아이가 존재하고 rvisited가 0이라면, 이사하지 않은 올바른 아이가 이전에 이사하지 않았으므로 올바른 자녀를 다룰 것임을 의미합니다.
{{
// 현재로서는 오른쪽 자식의 노드에서 끝까지 왼쪽 하단으로 이동 하여이 경로의 모든 노드를 스택에 넣어야합니다.
// 물론, 스택에 들어가기 전에 노드의 rvisited를 1로 설정하십시오. 오른쪽 아이의 스택은 오른쪽 아이가 그 전에 접근 할 것이라는 것을 의미하기 때문입니다 (이것은 우리가 항상 관찰을 통해 따라야하기 때문에 잘 이해됩니다. 방문을위한 스택 요소). 요소가 스택 상단에있을 때 오른쪽 자식을 방문하여 통과해야하므로 rvisited는 여기에서 1으로 설정할 수 있음을 알 수 있습니다.
sn.rvisited = 1;
// 왼쪽 하단으로 가서 스택에 경로에 모든 요소를 넣습니다.
p = sn.p.rchild;
while (p! = 0) {
푸시 (p, 0);
p = p.lchild;
}
} //이주기는 끝났습니다.
}
}