Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- UE4 커스텀로그
- moreeffectiveC++
- 언리얼엔진구조체
- 데이터애셋
- 람다
- UELOG
- 프로그래머스
- 언리얼가비지컬렉터
- 약참조
- 강참조
- BFS
- dataasset
- 애셋로드
- 람다사용정렬
- unorder_map
- 정렬알고리즘
- stl
- 선택정렬
- C++최적화
- 크리티컬섹션
- 알고리즘
- enumasByue
- 정렬
- 스마트포인터
- UML관련
- C++
- 자료구조
- UE_LOG
- map
- 델리게이트
Archives
- Today
- Total
기억을 위한 기록들
[자료구조] 재귀를 이용한 트리운행/스택을 이용한 트리운행 본문
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
class Node {
public:
Node()
: mData(0)
, mLeft(nullptr)
, mRight(nullptr)
, mRoot(nullptr)
{}
Node(int data)
: mData(data)
, mLeft(nullptr)
, mRight(nullptr)
, mRoot(nullptr)
{}
void PrintData()
{
cout << mData << "/";
}
Node* mLeft;
Node* mRight;
Node* mRoot;
private:
int mData;
};
void PostOrder(Node* node)
{
if (node == nullptr)
{
return;
}
PostOrder(node->mLeft);
PostOrder(node->mRight);
node->PrintData();
}
void PostOrderStack(Node* node)
{
if (node == nullptr)
{
return;
}
cout << "스택 : ";
stack<Node*> st;
Node* tempNode = node;
Node* doneNode = nullptr;
while (1)
{
if (tempNode != nullptr && tempNode != doneNode)
{
st.push(tempNode);
do
{
if (tempNode->mRight != nullptr)
{
st.push(tempNode->mRight);
}
if (tempNode->mLeft != nullptr)
{
st.push(tempNode->mLeft);
}
tempNode = tempNode->mLeft;
} while (tempNode != nullptr);
}
if (!st.empty())
{
tempNode = st.top();
st.pop();
//예외 처리
if (tempNode->mLeft != NULL && tempNode->mRight == NULL && tempNode->mLeft != doneNode)
{
if (tempNode != nullptr)
st.push(tempNode);
tempNode = tempNode->mLeft;
}
if (tempNode->mRight == NULL || tempNode->mRight == doneNode)
{
//노드 데이터 출력
tempNode->PrintData();
//완료 노드로 지정
doneNode = tempNode;
}
}
else
break;
}
cout << endl;
}
//중위 운행
void InOrder(Node* node)
{
if (node == nullptr)
{
return;
}
InOrder(node->mLeft);
node->PrintData();
InOrder(node->mRight);
}
void InOrderStack(Node* node)
{
cout << "스택 : ";
if (node == nullptr)
{
return;
}
stack<Node*> st;
Node* temp = node;
while (1) {
while (temp != nullptr)//제일 좌측 노드로
{
st.push(temp);
temp = temp->mLeft;
}
if (!st.empty())
{
temp = st.top();
st.pop();
temp->PrintData();
temp = temp->mRight;
}
else
{
break;
}
}
cout << endl;
}
//전위 운행
void PreOrder(Node* node)
{
if (node == nullptr)
{
return;
}
node->PrintData();
PreOrder(node->mLeft);
PreOrder(node->mRight);
}
void PreOrderStack(Node* node)
{
if (node == nullptr)
{
return;
}
stack<Node*> st;
cout << "스택 : ";
st.push(node);
while (!st.empty())
{
Node* curNode = st.top();
curNode->PrintData();
st.pop();
if (curNode->mRight != nullptr)
st.push(curNode->mRight);
if (curNode->mLeft != nullptr)
st.push(curNode->mLeft);
}
cout << endl;
}
int main()
{
Node* root = new Node(0);
Node* node1 = new Node(1);
Node* node2 = new Node(2);
Node* node3 = new Node(3);
Node* node4 = new Node(4);
root->mLeft = node1;
root->mRight = node2;
node1->mLeft = node3;
node1->mRight = node4;
cout << "전위 운행 : " << endl;
cout << "재귀 : ";
PreOrder(root);
cout << endl;
PreOrderStack(root);
cout << "------------" << endl;
cout << "중위 운행 : " << endl;
cout << "재귀 : ";
InOrder(root);
cout << endl;
InOrderStack(root);
cout << "------------" << endl;
cout << "후위 운행 : " << endl;
cout << "재귀 : ";
PostOrder(root);
cout << endl;
PostOrderStack(root);
cout << "------------" << endl;
return 0;
}
입력 된 트리 구성
결과
'자 & 알 > 자료구조' 카테고리의 다른 글
[자료구조] std::set 개념 (0) | 2021.08.16 |
---|---|
[자료구조] std::map & std::unordered_map 개념 (0) | 2021.08.16 |
[자료구조] 그래프(Graph)에 관하여 (0) | 2021.01.06 |
[자료구조] 힙(Heap)구현(for 우선순위 큐)/ C++ / (+함수포인터 변수) (0) | 2021.01.03 |
[자료구조] 힙(Heap) 특징 (0) | 2021.01.03 |