1. 程式人生 > >二叉樹的基本操作-C語言

二叉樹的基本操作-C語言

二叉樹的基本操作

在瞭解了二叉樹的概念之後, 大家會發現二叉樹的其實是一個遞迴的思維, 因此它的建立, 遍歷以及銷燬等操作可以用遞迴來實現

具體實現

定義一個二叉樹

//定義一個二叉連結串列
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;
}

效果圖
在這裡插入圖片描述

希望該篇文章能對大家有所幫助, 同時很真誠的接受大家的評論和建議