二叉樹的基本操作-C語言
阿新 • • 發佈:2018-12-30
二叉樹的基本操作
在瞭解了二叉樹的概念之後, 大家會發現二叉樹的其實是一個遞迴的思維, 因此它的建立, 遍歷以及銷燬等操作可以用遞迴來實現
具體實現
定義一個二叉樹
//定義一個二叉連結串列
typedef struct Node {
char data;
struct Node* lchild;
struct Node* rchild;
}BitNode, *BiTree;
遞迴建立一個二叉樹
//遞迴建立一個二叉樹
void CreateBiTree(BiTree* T) {
char ch = 0;
scanf("%c", &ch);
if (ch == ' ') {
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BitNode));
if (!(*T)) {
exit(0);
}
(*T)->data = ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
二叉樹的左插入操作
//二叉樹的左插入操作
//將 c 子樹插入到 p 指向結點的左孩子
int InsertLeftChild(BiTree p, BiTree c) {
if (p) {
c->rchild = p->lchild;
p->lchild = c;
return 1;
}
return 0;
}
二叉樹的右插入操作
//二叉樹的右插入操作
//將 c 子樹插入到 p 指向結點的右孩子
int InsertRightChild(BiTree p, BiTree c) {
if (p) {
c->rchild = p->rchild;
p->rchild = c;
return 1;
}
return 0;
}
返回二叉樹指定結點的指標
//返回二叉樹指定結點指標的操作
BiTree Point(BiTree T, char e) {
//定義一個佇列存放二叉樹中結點的指標
BiTree Q[MAXSIZE] = { NULL };
//初始化佇列
int front = 0, rear = 0;
BiTree adjust;
if (T) {
Q[rear] = T;
++rear;
//如果佇列不為空就執行此操作
while (front != rear) {
adjust = Q[front];
++front;
if (adjust->data == e) {
return adjust;
}
//將每個根結點的左孩子入隊
if (adjust->lchild) {
Q[rear] = adjust->lchild;
++rear;
}
//將每個根結點的右孩子入隊
if (adjust->rchild) {
Q[rear] = adjust->rchild;
++rear;
}
}
}
return NULL;
}
返回二叉樹指定結點的左孩子操作
//返回二叉樹指定結點的左孩子的操作
char LeftChild(BiTree T, char e) {
BiTree adjust = NULL;
if (T) {
adjust = Point(T, e);
if (adjust && adjust->lchild) {
return adjust->lchild->data;
}
}
return 0;
}
返回二叉樹指定結點的右孩子操作
//返回二叉樹指定結點的右孩子的操作
char RightChild(BiTree T, char e) {
BiTree adjust = NULL;
if (T) {
adjust = Point(T, e);
if (adjust && adjust->rchild) {
return adjust->rchild->data;
}
}
return 0;
}
遞迴銷燬二叉樹
//銷燬二叉樹
void Destroy(BiTree* T) {
if (*T) {
if ((*T)->lchild) {
Destroy(&((*T)->lchild));
}
if ((*T)->rchild) {
Destroy(&((*T)->rchild));
}
free(*T);
*T = NULL;
}
}
二叉樹的左刪除操作
//二叉樹的左刪除操作
void LiftDelete(BiTree p) {
if (p) {
Destroy(&(p->lchild));
}
}
二叉樹的右刪除操作
//二叉樹的右刪除操作
void RightDelete(BiTree p) {
if (p) {
Destroy(&(p->rchild));
}
}
二叉樹的先序遍歷
//二叉樹的先序遍歷
void Traverse(BiTree T) {
if (T) {
printf("%2c", T->data);
Traverse(T->lchild);
Traverse(T->rchild);
}
}
測試
int main() {
BiTree t1;
CreateBiTree(&t1);
printf("\n**************************\n");
Traverse(t1);
printf("\n**************************\n");
BiTree p;
p = Point(t1, 'B');
BiTree q = (BiTree)malloc(sizeof(BitNode));
if (!q) {
exit(0);
}
q->data = 'Z';
q->lchild = NULL;
q->rchild = NULL;
if (InsertLeftChild(p, q));
Traverse(t1);
printf("\n**************************\n");
RightDelete(p);
Traverse(t1);
printf("\n**************************\n");
char c = LeftChild(t1, 'B');
printf("%c\n", c);
Destroy(&t1);
if (!t1) {
printf("OK\n");
}
system("pause");
return 0;
}
效果圖
希望該篇文章能對大家有所幫助, 同時很真誠的接受大家的評論和建議