#include <iostream>
#include<queue>
using namespace std;
//二叉树的链式存储:建立;非递归:层次遍历;递归:先序遍历,中序遍历,后序遍历;
/*二叉树定义*/
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
/*初始化*/
void initial(BiTree &T){
T = (BiTNode*)malloc(sizeof(BiTNode));
T->lchild = NULL;
T->rchild = NULL;
}
/*访问结点*/
void visit(BiTree &T){
printf("%c",T->data);
}
/*建立二叉树*/
void CreateBiTree(BiTree &T)
{
char ch;
if((ch=getchar())=='#')//输入:AB##CD##EF##G##
T=NULL;
else
{
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
/*先序遍历*/
void PreTraverse(BiTree T)
{
if(T!=NULL)
{
visit(T);
PreTraverse(T->lchild);
PreTraverse(T->rchild);
}
}
/*中序遍历*/
void InOrder(BiTree T)
{
if(T!=NULL)
{
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
/*后序遍历*/
void PostOrder(BiTree T)
{
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
int Depth(BiTree T){
//返回深度
int d,dl,dr;
if(!T)
d=0;
else {
dl=Depth(T->lchild);
dr=Depth(T->rchild);
d=1+(dl>dr?dl:dr) ;
}
return d;
}
/*层次遍历*/
void LevelOrder(BiTree T){
queue<BiTree> TreeQueue; //使用队列 queue<(结构体的名字)> (你定义的队列名字);
TreeQueue.push(T); //先将队头元素加入队列
BiTNode *p;
while (!TreeQueue.empty()) //循环判断队列是否未空,若不空则
{
p = TreeQueue.front(); //获取队列头节点,并出队列
TreeQueue.pop();
visit(p); //访问队列元素
if (p->lchild!=NULL) //如果该节点有左节点
TreeQueue.push(p->lchild); //加入队列
if (p->rchild!=NULL) //如果该节点有右节点
TreeQueue.push(p->rchild); //加入队列
}
}
/*求结点个数*/
int TreeSize(BiTree T)
{
return T == NULL ? 0 : TreeSize(T->lchild) + TreeSize(T->rchild) + 1;
}
int main()
{
BiTree T;
initial(T);
cout<<"先序创建树(输入#停止生成节点):\n";
CreateBiTree(T);
cout<<"先序遍历:\n";
PreTraverse(T);
cout<<"\n中序遍历:\n";
InOrder(T);
cout<<"\n后序遍历:\n";
PostOrder(T);
cout<<"\n层次遍历:\n";
LevelOrder(T);
cout<<"\n深度:\n";
int d=Depth(T);
printf("%d",d);
cout<<"\n结点个数:\n";
int n=TreeSize(T);
printf("%d",n);
return 0;
}
二叉树的链式存储:建立;非递归:层次遍历;递归:先序遍历,中序遍历,后序遍历;
最新推荐文章于 2024-07-22 23:59:01 发布