之前的一个博客
数据结构——二叉树的层次遍历看完这个,可以简单实现下面的问题
问题:
1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值。
2.用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。
解决问题的思路:
- int BiTree_height1(BiTree T)函数用于计算出树的高度(深度);
- void levelOrder( BiTree T);创建了一个记录每层树的宽度数组width[totalLevel]
- void printNodeAtLevel(BiTree T,int level,int *width,int static_level) ;参数:有宽度数组的指针,和静态的层数(因为level会因为函数递归而改变,所以建立这一个)函数主体记录每一层节点数
- void levelOrder2(const BiTree T);设立一个变量,统计单分支结点的个数
- void printNodeAtLevel2(BiTree T,int level,int *single_branch);
核心代码
int BiTree_height1(BiTree T)//求树的深度算法1
{if(T==NULL)return 0;else{if(BiTree_height1(T->lchild)>BiTree_height1(T->rchild))return 1+BiTree_height1(T->lchild);elsereturn 1+BiTree_height1(T->rchild);}}
void printNodeAtLevel(BiTree T,int level,int *width,int static_level)
{ if(T==NULL||level<0) return; if(level==0) { printf("%c ",T->data);width[static_level]++;return; } // 左子树的 level - 1 级 printNodeAtLevel(T->lchild,level-1,width,static_level); // 右子树的 level - 1 级 printNodeAtLevel(T->rchild,level-1,width,static_level);
}void levelOrder( BiTree T)
{if(T==NULL)return;int totalLevel = BiTree_height1(T);int width[totalLevel]={0};for(int i = 0; i< totalLevel; i++){printNodeAtLevel(T, i,width,i);printf("\t\t\t第%d层的宽度为:%d",i,width[i]);printf("\n");//打印完一层,换行}int max_width=width[0],max=1;for(int j=1;j<totalLevel;j++){if(width[j]>max_width){max_width=width[j];max=j+1;}}printf("最大宽度为%d,首先出现最大宽度的是第%d层",max_width,max);} void printNodeAtLevel2(BiTree T,int level,int *single_branch)
{ if(T==NULL||level<0) return; if(level==0) { printf("%c ",T->data);if(T->lchild==NULL&&T->rchild!=NULL||T->lchild!=NULL&&T->rchild==NULL)//单分支时 single_branch[1]++; return; } // 左子树的 level - 1 级 printNodeAtLevel2(T->lchild,level-1,single_branch); // 右子树的 level - 1 级 printNodeAtLevel2(T->rchild,level-1,single_branch);
}void levelOrder2(const BiTree T)
{if(T==NULL)return;int totalLevel = BiTree_height1(T);int single_branch[1]={0};for(int i = 0; i< totalLevel; i++){printNodeAtLevel2(T, i,single_branch);printf("\n");//打印完一层,换行}printf("该树的单分支节点(即度为1的节点)数为:%d",single_branch[1]);}
全部代码(可直接执行)
#include<stdio.h>
#include<bits/stdc++.h> typedef char TElemType;
typedef int status;
typedef struct BiNode
{TElemType data;struct BiNode *lchild;struct BiNode *rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree &T)//二叉树的先序创建
{TElemType ch;scanf("%c",&ch);if(ch=='#')T=NULL;else {T=(BiNode*)malloc(sizeof(BiNode));if(!T)exit(-1);T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
}void DestroyBiTree(BiTree &T)//二叉树的销毁算法
{if(T==NULL)exit(-1);else{DestroyBiTree(T->lchild);DestroyBiTree(T->rchild);free(T);}
}int preorderTraverse(BiTree T)//二叉树的先序递归遍历算法
{if(T==NULL)return 0;else {printf("%c ",T->data);preorderTraverse(T->lchild);preorderTraverse(T->rchild);}} int InorderTraverse(BiTree T)//二叉树的中序递归遍历算法
{if(T==NULL)return 0;else {InorderTraverse(T->lchild);printf("%c ",T->data);InorderTraverse(T->rchild);}}int PostorderTraverse(BiTree T)//二叉树的后序递归遍历算法
{if(T==NULL)return 0;else {PostorderTraverse(T->lchild);PostorderTraverse(T->rchild);printf("%c ",T->data);}}int BiTree_height1(BiTree T)//求树的深度算法1
{if(T==NULL)return 0;else{if(BiTree_height1(T->lchild)>BiTree_height1(T->rchild))return 1+BiTree_height1(T->lchild);elsereturn 1+BiTree_height1(T->rchild);}}
void printNodeAtLevel(BiTree T,int level,int *width,int static_level)
{ if(T==NULL||level<0) return; if(level==0) { printf("%c ",T->data);width[static_level]++;return; } // 左子树的 level - 1 级 printNodeAtLevel(T->lchild,level-1,width,static_level); // 右子树的 level - 1 级 printNodeAtLevel(T->rchild,level-1,width,static_level);
}void levelOrder( BiTree T)
{if(T==NULL)return;int totalLevel = BiTree_height1(T);int width[totalLevel]={0};for(int i = 0; i< totalLevel; i++){printNodeAtLevel(T, i,width,i);printf("\t\t\t第%d层的宽度为:%d",i,width[i]);printf("\n");//打印完一层,换行}int max_width=width[0],max=1;for(int j=1;j<totalLevel;j++){if(width[j]>max_width){max_width=width[j];max=j+1;}}printf("最大宽度为%d,首先出现最大宽度的是第%d层",max_width,max);} void printNodeAtLevel2(BiTree T,int level,int *single_branch)
{ if(T==NULL||level<0) return; if(level==0) { printf("%c ",T->data);if(T->lchild==NULL&&T->rchild!=NULL||T->lchild!=NULL&&T->rchild==NULL)//单分支时 single_branch[1]++; return; } // 左子树的 level - 1 级 printNodeAtLevel2(T->lchild,level-1,single_branch); // 右子树的 level - 1 级 printNodeAtLevel2(T->rchild,level-1,single_branch);
}void levelOrder2(const BiTree T)
{if(T==NULL)return;int totalLevel = BiTree_height1(T);int single_branch[1]={0};for(int i = 0; i< totalLevel; i++){printNodeAtLevel2(T, i,single_branch);printf("\n");//打印完一层,换行}printf("该树的单分支节点(即度为1的节点)数为:%d",single_branch[1]);}
int main()
{BiTree T;printf("创建树输入树T的先序序列(其中使用#代表空节点)\n");CreateBiTree(T);printf("先序遍历算法");preorderTraverse(T);printf("\n中序遍历算法");InorderTraverse(T);printf("\n后序遍历算法");PostorderTraverse(T);printf("\n二叉树层次遍历算法\n");levelOrder(T);printf("\n二叉树层次遍历算法\n");levelOrder2(T);}
例如: