C 언어 데이터 구조의 단서 이 진 트 리 와 그 옮 겨 다 니 기
이 진 트 리 를 옮 겨 다 니 는 것 은 일정한 규칙 으로 이 진 트 리 의 노드 를 하나의 선형 서열 로 배열 하여 이 진 트 리 노드 의 각종 옮 겨 다 니 는 서열 을 얻 는 것 이다.그 실질 은 비 선형 구 조 를 선형 화 하 는 것 이다.이 접근 시퀀스 에서 모든 노드 에 직접 전구 와 직접 후계 가 있 도록 합 니 다.전통 적 인 체인 구 조 는 부자 관 계 를 나 타 낼 수 밖 에 없다.즉,65509℃는 노드 가 옮 겨 다 니 는 전구 와 후계 의 65509℃를 직접 얻 을 수 없다.우 리 는 이 진 링크 가 나타 내 는 이 진 트 리 에 대량의 빈 지침 이 있다 는 것 을 알 고 있다.이런 빈 지침 으로 노드 를 가리 키 는 전구 와 후계 의 지침 을 저장 할 때 이 진 트 리 의 일부 조작 을 더욱 편리 하 게 활용 할 수 있다.단서 이 진 트 리 를 도입 하 는 목적 은 노드 의 전구 와 후계 찾기 를 가속 화하 기 위 한 것 이다.이 진 트 리 에 대한 단서 화 는 이 진 트 리 를 한 번 옮 겨 다 니 는 것 입 니 다.옮 겨 다 니 는 과정 에서 노드 의 좌우 포인터 가 비어 있 는 지 확인 하고 비어 있 으 면 전구 와 후계 노드 를 가리 키 는 단서 로 바 꿉 니 다.
이 진 트 리 가 단서 화 되 지 않 았 다 면<<비 재 귀적>>코드 로 옮 겨 다 닐 수 있 습 니 다.하지만<<스 택>>의 도움 을 받 아야 합 니 다.하지만 온라인 으로 삭 화 된 이 진 트 리 를<비 재 귀적>>으로 옮 겨 다 니 면 스 택 의 보조 가 필요 하지 않 습 니 다.
구현 코드:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef int Status;
/* , Link Thread
* Link
* Thread
* */
typedef enum {
Link,Thread
}PointerTag;
typedef struct ThrBiTrNode{
ElemType data;
struct ThrBiTrNode *lchild, *rchild;
PointerTag rTag, lTag;
}ThrBiTrNode, *ThrBiTree;
ThrBiTree Pre;
Status InitThreadBinaryTree(ThrBiTree* T){
*T = NULL;
return OK;
}
// ,lchild rchild , lTag rTag Link
Status ThreadBinaryTree_PreOrderInput(ThrBiTree* T){
ElemType c;
scanf("%c", &c);
if( ' ' == c ){
*T = NULL;
}
else{
*T = (ThrBiTrNode*)malloc(sizeof(ThrBiTrNode));
if( !*T ){
return ERROR;
}
(*T)->data = c;
(*T)->lTag = Link;
(*T)->rTag = Link;
ThreadBinaryTree_PreOrderInput(&(*T)->lchild);
ThreadBinaryTree_PreOrderInput(&(*T)->rchild);
}
return OK;
}
//<< >> << >>, Pre ,
// , 。
//1
//2 // base
//3
Status InOrderThread(ThrBiTree T){
if( T != NULL ){
InOrderThread(T->lchild); //
//
if( T->lchild == NULL ){ // , lchild
//Pre
T->lTag = Thread;
T->lchild = Pre;
}
if( Pre->rchild == NULL ){ // Pre T,
// Pre , Pre rchild
// Pre rchild , T
Pre->rTag = Thread;
Pre->rchild = T;
}
Pre = T; //
//Pre
//
InOrderThread(T->rchild); //
}
return OK;
}
// , Pre
Status CreateInOrderThreadBinaryTree(ThrBiTree T, ThrBiTree* headOfTree){
*headOfTree = (ThrBiTrNode*)malloc(sizeof(struct ThrBiTrNode));
if( !headOfTree )
return ERROR;
(*headOfTree)->lTag = Link; // T
(*headOfTree)->rTag = Thread; // rchild
(*headOfTree)->rchild = *headOfTree; //
if( T == NULL ){
(*headOfTree)->lchild = *headOfTree; // T , lchild
//
}
else{
(*headOfTree)->lchild = T;
Pre = *headOfTree; // Pre
InOrderThread(T); //
//printf("
%c
",Pre->data);
// InOrderThread Pre
//
Pre->rTag = Thread;
Pre->rchild = *headOfTree;
//(*headOfTree)->rchild = Pre;
}
return OK;
}
// << >>
// 。
// , << >>
// , << >>, ,
// << >> 。
Status visit(ElemType c){
printf("%c ", c);
return OK;
}
Status InOrderTeaverse_NoRecursion(ThrBiTree T, ThrBiTree headOfTree){
//headOfTree T ,headOfTree->lchild = T;
while( T != headOfTree ){
while( T->lTag == Link ){ // ( )
// while if//
// if while//
T = T->lchild;
}
visit(T->data);
while( T->rTag == Thread && T->rchild != headOfTree){
// while T=T->rchild
// ifelse 。
//if(rchild && )
//else(rchild )-->
// T=T->rchild
T = T->rchild;
visit(T->data);
}
T = T->rchild;
}
return OK;
}
//
ThrBiTrNode* SeekFirstNode_InOrderThrBiTree(ThrBiTree T){
if( T != NULL ){
while( T->lTag == Link ){
T = T->lchild;
}
return T;
}
return ERROR;
}
// P
ThrBiTrNode* GetNextNode(ThrBiTrNode* CurrentP){
if( CurrentP->rTag == Link ){ // ,
// root 。
// seekFirstNode 。
return SeekFirstNode_InOrderThrBiTree(CurrentP->rchild);
}
else{ // , rchild
return CurrentP->rchild;
}
}
// ,SeekFirstNode_InOrderThrBiTree GetNextNode
//
Status InOrderTraverse_NoRecursion_Method(ThrBiTree T, ThrBiTree head){
for( T = SeekFirstNode_InOrderThrBiTree(T) ; T != head ; T = GetNextNode(T) )
visit(T->data);
return OK;
}
//test
/* ShowThread T , InOrderTraverse
* , , 。 :
* , , InOrderTraverse if( T )
* , 。
Status ShowThread(ThrBiTree C){
printf("%d %d %d %d
",(C->lchild)->data,(C->rchild)->data,C->lTag,C->rTag);
printf("%d %d
",C->lTag,C->rTag);
return OK;
* */
//
Status InOrderTraverse(ThrBiTree T){
if( T ){
InOrderTraverse(T->lchild);
visit(T->data);
InOrderTraverse(T->rchild);
}
return OK;
}
int main(){
ThrBiTree T,R,Head = NULL;
InitThreadBinaryTree(&T);
printf("Please Input Binary Tree By PreOrder
");
ThreadBinaryTree_PreOrderInput(&T);
printf(" InOrder Traverse before Thread with Recursion
");
InOrderTraverse(T);
printf("
");
CreateInOrderThreadBinaryTree(T,&Head);
printf(" InOrder Traverse after Thread with no-Recursion
");
InOrderTeaverse_NoRecursion(T,Head);
printf("
");
printf("The root is %c
", T->data); //
// ,
// 。
ThrBiTrNode *firstOfInOrder = NULL,*secondOfInOrder = NULL;
if( SeekFirstNode_InOrderThrBiTree(T) != ERROR ){
firstOfInOrder = SeekFirstNode_InOrderThrBiTree(T);
printf("the value of First Node of InOrderThreadBinaryTree is %c
", firstOfInOrder->data);
}
secondOfInOrder = GetNextNode(firstOfInOrder);
printf("the value of Node after D is: %c
", secondOfInOrder->data);
secondOfInOrder = GetNextNode(secondOfInOrder);
printf("the value of Node after B is: %c
", secondOfInOrder->data);
secondOfInOrder = GetNextNode(secondOfInOrder);
printf("the value of Node after E is: %c
", secondOfInOrder->data);
secondOfInOrder = GetNextNode(secondOfInOrder);
printf("the value of Node after A is: %c
", secondOfInOrder->data);
secondOfInOrder = GetNextNode(secondOfInOrder);
printf("the value of Node after C is: %c
", secondOfInOrder->data);
secondOfInOrder = GetNextNode(secondOfInOrder);
printf("the value of Node after G is: %c
", secondOfInOrder->data);
secondOfInOrder = GetNextNode(secondOfInOrder);
printf("the value of Node after root is: %c
", secondOfInOrder->data);
printf(" InOrder Traverse after Thread with no-Recursion Method_2
");
InOrderTraverse_NoRecursion_Method(T,Head);
return 0;
}
이상 은 단서 이 진 트 리 와 옮 겨 다 니 는 실례 입 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 지역사회 에 가서 토론 을 하 십시오.읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 데이터 구조의 단서 이 진 트 리 와 그 옮 겨 다 니 기이 진 트 리 를 옮 겨 다 니 는 것 은 일정한 규칙 으로 이 진 트 리 의 노드 를 하나의 선형 서열 로 배열 하여 이 진 트 리 노드 의 각종 옮 겨 다 니 는 서열 을 얻 는 것 이다.그 실질 은 비 선형 구...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.