二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。
一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。
二叉树的建立过程是二叉链表的方式,即当前结点不光存储当前结点的数据,还存储左右孩子的指针
这里多加了一个level用来判断结点在第几层
二叉树中的中序和后序遍历都是因为结点的建立问题,不能用于建立一个二叉树
include<stdlib.h>
include<stdio.h>
typedef char ElemType;
//二叉链表的构建形式
typedef struct binaryTree
{
ElemType data;
struct binaryTree *lchild,*rchild;
}binaryTree,*BiTree;
//访问一个结点并打印
void visited(char c,int level)
{
printf("%c在第%d层 \n",c, level);
}
//使用前序的方式建立一个二叉树
void PreorderCreateBinaryTree(BiTree *T)
{
char c;
scanf("%c",&c);
if( '#' == c)
{
*T = NULL;
}
else{
*T = (BiTree)malloc(sizeof(binaryTree));
(*T)->data = c;
PreorderCreateBinaryTree(&(*T)->lchild);
PreorderCreateBinaryTree(&(*T)->rchild);
}
}
//前序遍历二叉树
void PreorderTraversal(BiTree T,int level)
{
if( T )
{
visited(T->data,level);
PreorderTraversal(T->lchild,level + 1);
PreorderTraversal(T->rchild, level + 1);
}
}
//中序遍历二叉树
void OrderTraversal(BiTree T ,int level)
{
if( T )
{
PreorderTraversal(T->lchild,level + 1);
visited(T->data,level);
PreorderTraversal(T->rchild,level + 1);
}
}
//后序遍历二叉树
void PosteriorTraversal(BiTree T,int level)
{
if( T )
{
PosteriorTraversal(T->lchild,level + 1);
PosteriorTraversal(T->rchild,level + 1);
visited(T->data,level);
}
}
//层序的方式实现二叉树的遍历--------------------------------------------
//利用递归的方法,按层进行打印,我们把根节点当做第0层,之后层次依次增加,如果我们想打印第二层怎么办呢,利用递归的代码如下:
int sequence_traversal_level(BiTree T, int level) {
if (!T || level < 0) //当树的结点不存在,并且或者根节点不存在(深度小于0)的时候,结束
return 0;
if (0 == level) { //当level为0的时候,说明这一层遍历完成,需要换行
printf("%c ",T->data);
return 1;
}
return sequence_traversal_level(T->lchild, level - 1) + sequence_traversal_level(T->rchild, level - 1);//左右孩子的返回值加一次为0,才能确定没有下一层,否则就需要遍历下一层;
}
//如果我们成功的打印了给定的层次,那么就返回非0的正值,如果失败返回0。
//有了这个思路,我们就可以应用一个循环,来打印这颗树的所有层的节点,但是有个问题就是我们不知道这棵二叉树的深度,
//怎么来控制循环使其结束呢,仔细看一下sequence_traversal_level,如果指定的Tree是空的,那么就直接返回0,
//当返回0的时候,我们就结束循环,说明没有节点可以打印了。
void sequence_traversal(BiTree T) {
int i = 0;
for (i = 0; ; i++) {
if (!sequence_traversal_level(T, i)) //当链表中的第i层不存在的时候退出,或者树为空的时候 遍历完成,退出循环
{
break;
}
else{ //否则就是该层次打印完成,换行
printf("\n");
}
}
printf("\n");
}
int main()
{
BiTree T;
int level = 1;
printf("建立二叉树并访问节点");
printf("请输入结点数据,建立树:\n");
PreorderCreateBinaryTree(&T);
PosteriorTraversal(T , level);
return 0;
}