크리스마스 휴가를 더 잘 처리 할 수있는 방법이 없으므로 이진 검색 트리를 만들어보기로했습니다. 인쇄 기능이 붙어 있습니다. 그것의 논리는 어떻게 작동해야합니까? 트리는 이미 다소 정렬 된 순서로 그것을 삽입하고 있으므로 가장 작은 값에서 가장 큰 값으로 트리를 인쇄하려고합니다.C++ 바이너리 검색 트리를 인쇄하십시오.
그래서 첫 번째 값을 인쇄하려면 트리의 가장 먼 왼쪽 분기로 이동해야합니다. 그렇습니다. 그 후에 어떻게 백업 방식을 기억합니까? 이전 노드를 저장해야합니까? 위키 피 디아 (Wikipedia)에서 검색을하면 스택을 사용하는 해결책이 생겼습니다. 그리고 다른 솔루션을 나는 그들이 어떻게 만들 었는지 이해할 수 없었습니다. 그래서 나는 대신 누군가가 나를 밝힐 수 있기를 바라고 있습니다.
필자의 삽입 기능이 정상적으로 작동하는지 궁금합니다. 나는 다른 사람의 해결책이 더 작은 것을 보았다.
void treenode::insert(int i)
{
if(root == 0)
{
cout << "root" << endl;
root = new node(i,root);
}
else
{
node* travel = root;
node* prev;
while(travel)
{
if(travel->value > i)
{
cout << "travel left" << endl;
prev = travel;
travel = travel->left;
}
else
{
cout << "travel right" << endl;
prev = travel;
travel = travel->right;
}
}
//insert
if(prev->value > i)
{
cout << "left" << endl;
prev->left = new node(i);
}
else
{
cout << "right" << endl;
prev->right = new node(i);
}
}
}
void treenode::print()
{
node* travel = root;
while(travel)
{
cout << travel->value << endl;
travel = travel->left;
}
}
재미있는 일이 있습니다. 그렇게 재밌지는 않다. 나는 그것을 이해하지 못한다 ... 나는 재귀를 싫어한다 ... – starcorn
@starcorn - 재귀에 대해 그런 식으로 느낀다면, 나의 제안은이 프로젝트를 떨어 뜨리고 잠시 동안 Lisp에서 프로그램을 작성하는 것이다. 당신은 그것에 편안합니다. 가끔 그것을 피하는 이유가 있지만 진정한 전문 개발자가 되려면 재귀가 도구 상자에 있어야합니다. –
@starcorn - 초창기 재귀는 매우 어려울 수 있습니다. 다음은 재귀를 쉽게 이해할 수있는 방법입니다. 재귀 호출의 "핵심"은 재귀 자체가 아니며, "최종 사례"즉, 수행하지 않을 때 실행되는 코드 부분에 있습니다. 재귀 호출을하십시오. 차이점은 postorder, preorder 및 inorder 인 인쇄 기능을 이해하려고합니다. 빠른 검색을 통해이 웹 페이지가 나타났습니다. http://www.cs.umd.edu/class/spring2002/cmsc214/Tutorial/recursion.html – Abhi