二叉树的基本操作-C语言

版权声明:Sock的blog, 可以偷看但不可以偷走哦 https://blog.csdn.net/qq_42957923/article/details/85339176

二叉树的基本操作

在了解了二叉树的概念之后, 大家会发现二叉树的其实是一个递归的思维, 因此它的创建, 遍历以及销毁等操作可以用递归来实现

具体实现

定义一个二叉树

//定义一个二叉链表
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;
}

效果图
在这里插入图片描述

希望该篇文章能对大家有所帮助, 同时很真诚的接受大家的评论和建议

猜你喜欢

转载自blog.csdn.net/qq_42957923/article/details/85339176