c语言数据结构之二叉树(一)构造二叉树以及遍历二叉树

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 [1]  。

二叉树是n个有限元素的集合该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点


以下为二叉树的代码实现:

#include <stdio.h>
#include <stdlib.h>

//定义二叉树的基本结构
typedef struct linkTree {
	int data;
	struct linkTree *lchild, *rchild;
} linkTree, *linkPoint;

//通过递归构造二叉树
void creatBody(linkPoint *p) {
	int num;
	scanf("%d", &num);
	if (num == 0)
		(*p) = NULL;
	else {
		(*p) = (linkPoint)malloc(sizeof(linkTree));
		(*p)->data = num;
		creatBody(&((*p)->lchild));
		creatBody(&((*p)->rchild));
	}
}

//先序遍历二叉树
void preOrder(linkPoint p) {
	if (p != NULL) {
		printf("%d ", p->data);
		preOrder(p->lchild);
		preOrder(p->rchild);
	}
}

//中序遍历二叉树
void midOrder(linkPoint p) {
	if (p != NULL) {
		midOrder(p->lchild);
		printf("%d ", p->data);
		midOrder(p->rchild);
	}
}

//后序遍历二叉树
void behOrder(linkPoint p) {
	if (p != NULL) {
		behOrder(p->lchild);
		behOrder(p->rchild);
		printf("%d ", p->data);
	}
}

//主函数
int main() {
	linkPoint p = (linkPoint)malloc(sizeof(linkTree));
	creatBody(&p);
	midOrder(p);
	printf("\n");
	preOrder(p);
	printf("\n");
	behOrder(p);
	printf("\n");
	return 0;
}


  1. 如果想将二叉树变为线索二叉树,可以添加以下代码
//通过遍历将二叉树变为线索二叉树
void addClue(linkPoint *p, linkPoint pre) {
	if ((*p) != NULL) {
		addClue(&((*p)->lchild), pre);
		if ((*p)->lchild = NULL) {
			(*p)->lchild = pre;
			(*p)->ltag = 1;
		}
		if (pre != NULL && pre->rchild == NULL) {
			pre->rchild = *p;
			pre->rtag = 1;
		}
		pre = *p;
		addClue(&((*p)->rchild), pre);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值