前言:
二叉树的学习结束了,还是决定把基础的知识在巩固一遍,最好的方法就是写程序了。代码附上,有二叉树的创建先序遍历,返回节点,按层次遍历。嘻嘻
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<iomanip>
using namespace std;
#define MAXQSIZE 100
//二叉树的二叉链表储存表示
typedef struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree,P;
//中序遍历的递归算法
void InOrderTraverse(BiTree T)
{//中序遍历二叉树T的递归算法
if(T)//若二叉树非空
{
InOrderTraverse(T->lchild);//中序遍历左子树
cout<<T->data;//访问根节点
InOrderTraverse(T->rchild);//中序遍历右子树
}
}
void PreOrderTraverse(BiTree T)
{//先序遍历二叉树T的递归算法
if(T)//若二叉树非空
{
cout<<T->data;//访问根节点
PreOrderTraverse(T->lchild);//先序遍历左子树
PreOrderTraverse(T->rchild);//先序遍历右子树
}
}
void PostOrderTraverse(BiTree T)
{//后序遍历二叉树T的递归算法
if(T)//若二叉树非空
{
PostOrderTraverse(T->lchild);//后序遍历左子树
PostOrderTraverse(T->rchild);//后序遍历右子树
cout<<T->data;//访问根节点
}
}
//先序遍历创建二叉链表
void CreateBiTree(BiTree &T)
{//按先序次序输入二叉树中的节点的值(一个字符),创建二叉链表表示的二叉树T
char ch;
//"请按照先序遍历来输入二叉树节点"
cin>>ch;
if(ch=='#') T=NULL;//递归结束,建空树
else{
T = new BiTNode;//生成根节点
T->data = ch;//根节点数据域置为ch
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//计算二叉树的深度
int Depth(BiTree T)
{//计算二叉树的深度
if(T==NULL) return 0;
else
{
int m = Depth(T->lchild);
int n = Depth(T->rchild);
if(m>n) return(m+1);
else return(n+1);
}
}
//统计二叉树节点的个数
int NodeCount(BiTree T)
{//统计二叉树T中节点的个数
if(T==NULL) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int NodeLeaf(BiTree T)
{
//统计二叉树中叶子节点的个数
if(T==NULL)
return 0;
else if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else
return NodeLeaf(T->lchild)+NodeLeaf(T->rchild);
}
//统计度为1的节点个数
int Node1(BiTree T)
{
if(T==NULL)
return 0;
else if((T->lchild==NULL&&T->rchild)||(T->rchild==NULL&&T->lchild))
return Node1(T->lchild)+Node1(T->rchild)+1;
else
return Node1(T->lchild)+Node1(T->rchild);
}
//统计度为2的节点个数
int Node2(BiTree T)
{
if(T==NULL)
return 0;
else if(T->lchild!=NULL&&T->rchild!=NULL)
return Node2(T->lchild)+Node2(T->rchild)+1;
else
return Node2(T->lchild)+Node2(T->rchild);
}
//按层次遍历访问节点
void level_traverse(BiTree T)
{
int i = 1;
if (T == NULL)
return;
queue <BiTree> q;
q.push(T);
while (!q.empty())
{
T = q.front();
q.pop();
cout <<setw(2)<<T->data;
if (T->lchild!= NULL)
{
q.push(T->lchild);//左孩子入队
}
if (T->rchild != NULL)
{
q.push(T->rchild);//右孩子入队
}
}
}
int main()
{
int n;
char c;
BiTree T;
CreateBiTree(T);
do{
cout<<"1.输出二叉树先序、中序、后序遍历下的节点访问次序;"<<endl;
cout<<"2.输出二叉树的所有节点个数"<<endl;
cout<<"3.输出二叉树叶子个数"<<endl;
cout<<"4.输出二叉树度为1的节点个数"<<endl;
cout<<"5.输出二叉树度为2的节点个数"<<endl;
cout<<"6.输出二叉树的高度"<<endl;
cout<<"7.输出二叉树的按层次遍历的节点访问次序"<<endl;
cout<<"******请选择功能******"<<endl;
cin>>n;
switch(n)
{
case 1:
cout<<"先序:"<<endl;
PreOrderTraverse(T);
cout<<endl;
cout<<"中序:"<<endl;
InOrderTraverse(T);
cout<<endl;
cout<<"后序:"<<endl;
PostOrderTraverse(T);
cout<<endl;
break;
//输出二叉树先序、中序、后序遍历下的节点访问次序;
case 2:
cout<<"所有节点个数为:"<<NodeCount(T)<<endl;
break;//输出二叉树的所有节点个数
case 3:
cout<<"所有叶子节点个数为:"<<NodeLeaf(T)<<endl;
break;//输出二叉树的叶子节点个数
case 4:
cout<<"所有度为1的节点个数为:"<<Node1(T)<<endl;
break;//输出二叉树中度为1的节点个数
case 5:
cout<<"所有度为2的节点个数为:"<<Node2(T)<<endl;
break;//输出二叉树中度为2的节点个数
case 6:
cout<<"二叉树的高度为:"<<Depth(T)<<endl;
break;//输出二叉树的高度
case 7:
cout<<"按层次遍历:"<<endl;
level_traverse(T);
break;//输出二叉树按层次遍历序列
default:
break;
}
cout<<"是否继续(Y继续)"<<endl;
cin>>c;
}while(c=='Y'||c=='y');
return 0;
}
后记:
之后会来一个神奇的哈夫曼树,特工必备,现在也可以实现了。有更好的结构可以评论交流哦。