一.树基本知识点
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;
}