데이터 구조의 트 리 와 이 진 트 리 - 이 진 트 리 의 기본 동작
5235 단어 데이터 구조
//이 진 트 리 데이터 구조
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiTNode, *BiTree;
//이 진 트 리 초기 화
FILE* BTEF;
BiTree InitBiTree()
{
BiTree bt;
bt = NULL;
BTEF = fopen("BiTreeElem.txt", "r");
return bt;
}
//이 진 트 리 제거
void DestroyBiTree(BiTree bt)
{
if(bt)
{
DestroyBiTree(bt->lchild);
DestroyBiTree(bt->rchild);
free(bt);
}
fclose(BTEF);
}
//创建二叉树//通过文本文件读取二叉树节点信息,空节点以“0”表示,节点顺序为二叉树先序遍历顺序
void CreatBiTree(BiTree *bt) { char node; fread(&node, sizeof(char), 1, BTEF); if(node==' ') fread(&node, sizeof(char), 1, BTEF); if(node=='0') *bt = NULL; else { if(*bt==NULL) *bt = (BiTree) malloc (sizeof(BiTNode)); (*bt)->data = node; (*bt)->lchild = NULL; (*bt)->rchild = NULL; CreatBiTree(&(*bt)->lchild); CreatBiTree(&(*bt)->rchild); } }
//텍스트 정보 샘플
/*A B D 0 F 0 0 0 C 0 E G 0 0 0*/
//이 진 트 리 깊이 구하 기int BiTreeDepth(BiTree bt) { int leftBTDepth, rightBTDepth; if(bt==NULL) return 0; else { leftBTDepth = BiTreeDepth(bt->lchild)+1; rightBTDepth = BiTreeDepth(bt->rchild)+1; return leftBTDepth>rightBTDepth? leftBTDepth:rightBTDepth; } }
//이 진 트 리 부모 노드
//정 보 를 찾 는 근 거 는 노드 이름 이 고 반환 값 은 노드 포인터 입 니 다.BiTNode* BiTreeParent(BiTree bt, TElemType elem) { BiTNode* btn; if(bt!=NULL) { if (bt->lchild!=NULL) { if(bt->lchild->data!=elem) { btn = BiTreeParent(bt->lchild,elem); if(btn!=NULL) return btn; } else return bt; } if (bt->rchild!=NULL) { if(bt->rchild->data!=elem) return BiTreeParent(bt->rchild,elem); else return bt; } } return NULL; }
//이 진 트 리 왼쪽 아이BiTNode* LeftChild(BiTree bt, TElemType elem) { BiTNode* tbn; if(bt!=NULL) { if(bt->data==elem) return bt->lchild; else { tbn = LeftChild(bt->lchild, elem); if(tbn!=NULL) return tbn; return LeftChild(bt->rchild, elem); } } return NULL; }
//이 진 트 리 오른쪽 아이BiTNode* RightChild(BiTree bt, TElemType elem) { BiTNode* tbn; if(bt!=NULL) { if(bt->data==elem) return bt->rchild; else { tbn = RightChild(bt->lchild, elem); if(tbn!=NULL) return tbn; return RightChild(bt->rchild, elem); } } return NULL; }
//이 진 트 리 왼쪽 형제BiTNode* LeftSibling(BiTree bt, TElemType elem) { BiTNode *tbn; if(bt==NULL) return NULL; if (bt->rchild!=NULL) { if(bt->rchild->data==elem) return bt->lchild; else { tbn = LeftSibling(bt->rchild, elem); if(tbn!=NULL) return tbn; } } return LeftSibling(bt->lchild, elem); }
//이 진 트 리 오른쪽 형제BiTNode* RightSibling(BiTree bt, TElemType elem) { BiTNode *tbn; if(bt==NULL) return NULL; if (bt->lchild!=NULL) { if(bt->lchild->data==elem) return bt->lchild; else { tbn = RightSibling(bt->lchild, elem); if(tbn!=NULL) return tbn; } } return RightSibling(bt->rchild, elem); }
//이름 에 따라 이 진 트 리 노드 찾기BiTNode* SearchNode(BiTree bt, TElemType elem) { BiTNode *tbn; if(bt==NULL) return NULL; if(bt->data==elem) return bt; else { tbn = SearchNode(bt->lchild, elem); if(tbn!=NULL) return tbn; return SearchNode(bt->rchild, elem); } return NULL; }
//노드 삽입// , , ,
int InsertChild(BiTree bt, TElemType elem, int LR, BiTree child) { BiTNode* pn; if (!child||!bt||(LR!=0&&LR!=1)) return -1; if (LR==0) { pn = LeftChild(bt, elem); if(pn==NULL) SearchNode(bt, elem)->lchild = child; else return -1; } else { pn = RightChild(bt, elem); if(pn==NULL) SearchNode(bt, elem)->rchild = child; else return -1; } return 0; }
//노드 삭제int DeleteChild(BiTree bt, TElemType elem, int LR) { BiTNode* pn; if(!bt||(LR!=0&&LR!=1)) return -1; if(LR==0) { pn = LeftChild(bt, elem); if(pn!=NULL) { DeleteChild(bt, pn->data, 0); DeleteChild(bt, pn->data, 1); free(pn); if((pn=SearchNode(bt,elem))!=NULL) pn->lchild = NULL; } }else { pn = RightChild(bt, elem); if(pn!=NULL) { DeleteChild(bt, pn->data, 0); DeleteChild(bt, pn->data, 1); free(pn); if((pn=SearchNode(bt,elem))!=NULL) pn->rchild = NULL; } } }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.