//数据结构--树-------------------------------------------------------------------------
// 树是一个n个结点的有限集,n为0时,为空树
// 1.树的定义是递归的,即定义中用到了自身
// 2.树的根节点没有前驱,其他所有结点有且只有一个前驱
// 3.树中的所有结点有0个或者多个后驱
//二叉树--------------------------------------------------
// 1.一种特殊的数据结构
// 2.每个结点只有两个子树
// 遍历方式:
// 根节点的遍历顺序 前 中 后
// 前序 根->左->右
// 中序 左->根->右
// 后序 左->右->根
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
////创建一个结点
typedef struct TreeNode
{
char data;
struct TreeNode* Lchild;//左子串
struct TreeNode* Rchild;//右子串
}TreeNode;
//创建二叉树--先序
void createTree(TreeNode** T,int *index)
//要改变树中的内容,需要传二级指针,
//data --数据 index--索引
{
//获取一个数据
char ch;
scanf("%c", &ch);
*index += 1;//计数,计算data的长度
//如果输入的是# 则为空结点
if (ch == '#')
{
*T = NULL;
}
//不是空结点
else
{
//给T开辟空间
*T = (TreeNode*)malloc(sizeof(TreeNode));
//给data赋值
(*T)->data = ch;
//创建两个子树.引用创建树的函数本身,逻辑一致,进行递归
//左子树
createTree(&((*T)->Lchild),index);
//右子树
createTree(&((*T)->Rchild),index);
}
}
//前序遍历
void preOrder(TreeNode* T)
{
//如果为空
if (T == NULL)
{
return;
}
else
{
//先输出根数据
printf("%c ", T->data);
//输出左子树
preOrder(T->Lchild);
//输出右子树
preOrder(T->Rchild);
}
}
//中序遍历
void inOrder(TreeNode* T)
{
//如果为空
if (T == NULL)
{
return;
}
else
{
//输出左子树
inOrder(T->Lchild);
//输出根数据
printf("%c ", T->data);
//输出右子树
inOrder(T->Rchild);
}
}
//后序遍历
void postOrder(TreeNode* T)
{
//如果为空
if (T == NULL)
{
return;
}
else
{
//输出左子树
postOrder(T->Lchild);
//输出右子树
postOrder(T->Rchild);
//输出根数据
printf("%c ", T->data);
}
}
int main()
{
TreeNode* T;
int index = 0;
createTree(&T, &index);
preOrder(T);
printf("\n");
inOrder(T);
printf("\n");
postOrder(T);
return 0;
}
//二叉树层次遍历--------------------------------------------------
// 按层遍历:利用队列先进先出原则,一层一层出栈
//创建一个树结点
typedef struct TreeNode
{
char data;
struct TreeNode* Lchild;//左子串
struct TreeNode* Rchild;//右子串
}TreeNode;
//创建一个链式队列结点
typedef struct QueNode
{
TreeNode* data;
struct QueNode* prev;
struct QueNode* next;
}QueNode;
//创建一个树
void createTree(TreeNode** T,int *index)
//要改变树中的内容,需要传二级指针,
//data --数据 index--索引