二叉树的建立和三种遍历的递归方式

二叉树的每个结点至多只有二棵子树(不存在度大于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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值