二叉树及其创建和前中后序遍历

一.树基本知识点
1.树是一个非线性结构,它由多个节点组成一个具有层次关系的集合。每个节点具有零个或多个子节点,没有父节点的节点称为根节点,每个根节点只有一个父节点。
2.度:一个节点的子节点个数称为该节点的度。
3.非终端节点或分支节点:度不为0的节点。
4.父节点:若一个节点含有子节点,则该节点为子节点的父节点。
5.树的度:一棵树中,最大的节点的度称为树的度。
6.节点的层次:从根节点算起为第一层,根的子节点为第二层,以此类推。
7树的高度或深度:树中节点的最大层次。
二.二叉树的基本知识点
1.一棵二叉树是结点的一个有限集合,该集合或者为空,或具有左子树或右子树或左右子树。
2.二叉树的特点: 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。 二叉树的子树有左右之分,其子树的次序不能颠倒
3.特殊二叉树:1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
完全二叉树:通俗的来说就是它的所有编号必须要和同深度的满二叉树一一对应的二叉树。
三.类型定义

typedef struct Bintree
{
	char data;//:数据域
	int *Lchild;//:左指针域
	int *Rchild;//:右指针域
}BinTree;

四.二叉树的创建
这里我们用前序遍历的方式来创建

void CreateTree(BinTree **T)//:注意此处应用二级指针
{
	int val;
	scanf("%d", &val);//:键盘输入
	if (val == 0)//:若输入0,则表示空
		*T = NULL;
	else
	{
		*T = (BinTree*)malloc(sizeof(BinTree));//:若不为0,则开辟空间
		if (!*T)//:若为空返回0
			return 0;
		(*T)->data = val;//:将输入的数据放入
		CreateTree(&(*T)->Lchild);//:递归调用,放入左子树的数据,当左子树放完时开始放右子树的数据
		CreateTree(&(*T)->Rchild);//:递归调用,放入右子树的数据
	}
}

这里比如我们输入3 2 0 0 1 0 0,二叉树的结构如下
在这里插入图片描述
五.前序遍历
首先访问(打印)根结点,前序遍历左子树,前序遍历右子树

void PreBintree(BinTree *T)
{
	if (T == NULL)
		return;
	printf("%d  ", T->data);
	PreBintree(T->Lchild);
	PreBintree(T->Rchild);
}

六.中序遍历
中序遍历左子树
访问(打印)根节点
中序遍历右子树

void MidBintree(BinTree *T)
{
	if (T == NULL)
	{
		return;
	}
	MidBintree(T->Lchild);
	printf("%d  ", T->data);
	MidBintree(T->Rchild);
}

七.后序遍历
后续遍历左子树
后续遍历右子树
访问(打印)根节点

void AfterBintree(BinTree *T)
{
	if (T == NULL)
	{
		return;
	}
	AfterBintree(T->Lchild);
	AfterBintree(T->Rchild);
	printf("%d  ", T->data);
}

八.完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct Bintree
{
	char data;
	int *Lchild;
	int *Rchild;
}BinTree;
void CreateTree(BinTree **T)
{
	int val;
	scanf("%d", &val);
	if (val == 0)
		*T = NULL;
	else
	{
		*T = (BinTree*)malloc(sizeof(BinTree));
		if (!*T)
		{
			exit(1);
		}
		(*T)->data = val;
		CreateTree(&(*T)->Lchild);
		CreateTree(&(*T)->Rchild);
	}
}
void PreBintree(BinTree *T)
{
	if (T == NULL)
	{
		return;
	}
	printf("%d  ", T->data);
	PreBintree(T->Lchild);
	PreBintree(T->Rchild);
}
void MidBintree(BinTree *T)
{
	if (T == NULL)
	{
		return;
	}
	MidBintree(T->Lchild);
	printf("%d  ", T->data);
	MidBintree(T->Rchild);
}
void AfterBintree(BinTree *T)
{
	if (T == NULL)
	{
		return;
	}
	AfterBintree(T->Lchild);
	AfterBintree(T->Rchild);
	printf("%d  ", T->data);
}
int main()
{
	BinTree *T;
	CreateTree(&T);
	printf("前序遍历为:");
	PreBintree(T);
	printf("中序遍历为:");
	MidBintree(T);
	printf("后序遍历为:");
	AfterBintree(T);
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值