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

来源:互联网 发布:公司网络配置方案 编辑:程序博客网 时间:2024/06/15 07:14

二叉树的每个结点至多只有二棵子树(不存在度大于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 0