C 언어 이 진 트 리 의 몇 가지 옮 겨 다 니 는 방법 에 대한 상세 한 설명 과 인 스 턴 스
5408 단어 이 진 트 리옮 겨 다 니 는 방법
이 진 트 리 는 각 노드 마다 최대 두 개의 키 트 리 가 있 는 트 리 저장 구조 다.먼저 위의 그림 을 그 려 서 뒤의 분석 을 편리 하 게 하 다.
1.이 진 트 리 와 완전 이 진 트 리
위의 그림 은 전형 적 인 이 진 트 리 인 데 그 중에서 왼쪽 그림 은 만 이 진 트 리 라 고도 부 르 고 오른쪽 은 완전 이 진 트 리 이다.그런 후에 우 리 는 이 진 트 리 가 완전히 이 진 트 리 라 는 결론 을 얻 을 수 있 지만 반대로 꼭 그렇지 는 않다.만 이 진 트 리 의 정 의 는 잎 결 점 을 제외 하고 다른 결 점 은 아이들 이 모두 있 고 깊이 가 k 인 만 이 진 트 리 이 며 결 점 수 는 2 의 k 제곱 1 이다.완전 이 진 트 리 는 모든 결점 이 깊이 가 k 인 만 이 진 트 리 에서 번호 가 1 에서 n 까지 일일이 대응 하 는 것 이다.
2 나무의 깊이
나무의 가장 큰 층 차 는 바로 깊이 이다.예 를 들 어 위의 그림,깊이 는 4 이다.깊이 가 k 인 나 무 는 가지 고 있 는 최대 결 점 수 는 2 의 k 차방 에서 1 을 줄 인 다 는 것 을 쉽게 알 수 있다.
3 나무의 아이,형제,부모
위의 그림 에서 B,C 는 A 의 아이 이 고 B,C 는 서로 형제 이 며 A 는 B,C 의 양친 이다.
2.이 진 트 리 를 만 드 는 방법
먼저 이 진 트 리 의 저장 구 조 를 말 해 보 세 요.많은 다른 모델 과 마찬가지 로 순서 와 체인 두 가지 방식 도 있 습 니 다.전 자 는 간단 하지만 공간 을 낭비 하 는 문제 가 존재 합 니 다.예 를 들 어 다음 그림 의 이 진 트 리 는 순서대로 저장 합 니 다(0 은 비어 있 고 하위 트 리 가 없습니다).
1 2 3 4 5 6 7 0 0 0 0 8 0 0 0
공간 낭비 되 는 거 아니 야?
체인 구 조 는 다음 과 같이 정의 할 수 있다.
typedef struct _BiTNode
{
int data;
_BiTNode *leftChild;
_BiTNode *rightChild;
}BiTNode, *pBiTree;
그 다음 에 함수 하 나 를 써 서 이 진 트 리 를 만 들 수 있 습 니 다.과정 은 콘 솔 에 a 를 입력 하여 현재 이 층 을 종료 하고 이 층 에 좌우 아 이 를 만 들 지 않 겠 다 는 것 입 니 다.다른 알파벳 을 입력 하면 계속 만 들 겠 습 니 다.예 를 들 어 아래 의 입력 시퀀스:다음 구조의 이 진 트 리 를 만 들 었 습 니 다.
각 노드 의 수 치 는 100 보다 작은 숫자 를 무 작위 로 생 성 한다.동시에 나 도 자동 명령 시퀀스 함 수 를 써 서 테스트 하기 편리 하고 수 동 으로 입력 하지 않 아 도 된다.비 자동 과 자동 으로 생 성 된 함 수 는 다음 과 같다.
// ,
int CreateBiTree(pBiTree *root)
{
char ch = 0;
fflush(stdin);
if ((ch = getchar()) == 'a')//
{
*root = NULL;
}
else
{
*root = (BiTNode *)malloc(sizeof(BiTNode));
if (!(*root))
{
return RET_ERROR;
}
(*root)->data = GetRandom();
CreateBiTree(&(*root)->leftChild);
CreateBiTree(&(*root)->rightChild);
}
return RET_OK;
}
int g_i = 0;
// , ,
int CreateBiTreeAuto(pBiTree *root)
{
char szOrder[] = "bbaabaa";
char ch = 0;
if (szOrder[g_i++] == 'a')//
{
*root = NULL;
}
else
{
*root = (BiTNode *)malloc(sizeof(BiTNode));
if (!(*root))
{
return RET_ERROR;
}
(*root)->data = GetRandom();
CreateBiTreeAuto(&(*root)->leftChild);
CreateBiTreeAuto(&(*root)->rightChild);
}
return RET_OK;
}
트 리 플 순서선착순
먼저 순 서 를 옮 겨 다 니 는 것 은 먼저 뿌리 노드 에 접근 한 다음 에 왼쪽 서브 트 리,그리고 오른쪽 서브 트 리 입 니 다.예 를 들 어 그림 1 의 오른쪽 그림,먼저 옮 겨 다 니 는 출력 은 다음 과 같 습 니 다.
A,B,D,H,I,E,J,K,C,F,G
위의 사상 에 따 르 면 재 귀적 인 형식 으로 먼저 옮 겨 다 니 는 코드 를 쓰기 쉽다.
//
int PreOrderVisitTree(pBiTree T, VisitType pFuncVisit)
{
if (T)
{
(*pFuncVisit)(T->data);
if (PreOrderVisitTree(T->leftChild, pFuncVisit) == RET_OK)
{
if (PreOrderVisitTree(T->rightChild, pFuncVisit) == RET_OK)
{
return RET_OK;
}
}
return RET_ERROR;
}
else
{
return RET_OK;
}
}
중간 순서 와 뒷 순 서 를 옮 겨 다 닙 니 다.선조의 경험 이 있 으 면 이 두 가 지 는 잘 이해 할 수 있다.중 서 는 먼저 왼쪽 나 무 를 방문 한 다음 에 뿌리 가 맺 힌 다음 에 오른쪽 나 무 를 방문 하고 그 다음 에 왼쪽 나 무 를 방문 한 다음 에 오른쪽 나 무 를 방문 한 다음 에 뿌리 가 맺 힌 다.코드 가 더 쉬 워 요.호출 순 서 를 바 꾸 기만 하면 돼 요.
하지만 나 에 게 는 비 재 귀적 인 실현 을 제시 했다.재 귀 는 분명 하지만 효율 이 낮은 문제 가 존재 합 니 다.재 귀 하지 않 는 방안 은 스 택 구조 로 결산 정 보 를 저장 하고 스 택 방문 을 통 해 이 진 트 리 를 옮 겨 다 닙 니 다.창고 꼭대기 에 있 는 바늘 이 비어 있 지 않 을 때 왼쪽 나무,즉 왼쪽 나무 뿌리의 바늘 이 창고 에 들어간다.창고 꼭대기 바늘 이 비어 있 을 때 는 윗 층 으로 물 러 나 야 합 니 다.왼쪽 나무 에서 돌 아 왔 다 면 현재 층,즉 창고 꼭대기 의 뿌리 바늘 결점 을 방문 하 십시오.오른쪽 하위 트 리 에서 돌아 오 면 현재 층 이 옮 겨 다 니 고 있 음 을 설명 합 니 다.계속 스 택 을 반환 합 니 다.코드 는 다음 과 같 습 니 다:
// ,
int InOrderVisitTree(pBiTree T, VisitType pFuncVisit)
{
ponyStack binaryTreeStack;
InitStack(&binaryTreeStack, 4);
Push(&binaryTreeStack, &T);
pBiTree pTempNode;
while (!IsEmptyStack(binaryTreeStack))
{
while((GetTop(binaryTreeStack, &pTempNode) == RET_OK) && (pTempNode != NULL))
{
Push(&binaryTreeStack, &(pTempNode->leftChild));
}
Pop(&binaryTreeStack, &pTempNode);
if (!IsEmptyStack(binaryTreeStack))
{
Pop(&binaryTreeStack, &pTempNode);
(*pFuncVisit)(pTempNode->data);
Push(&binaryTreeStack, &(pTempNode->rightChild));
}
}
return RET_OK;
}
코드 다운로드 주소:http://xiazai.jb51.net/201701/yuanma/BinaryTreeDemo-master(jb51.net).rar읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
9. 데이터 구조의 이 진 트 리그 다음 에 우 리 는 이 진 트 리 의 생 성, 소각, 옮 겨 다 니 기, 그리고 각종 이 진 트 리 의 성질 에 착안 하여 (높이, 노드 개수, 균형 여부 등 특성) 이 진 트 리 의 일부 응용 을 소개 해 야 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.