C++创建二叉树及操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char ElemType;
const int MaxLength=30;//结点个数不超过30个
typedef struct BiTreeNode{
ElemType data;
struct BiTreeNode *lchild,*rchild;
}BiTreeNode,*BiTree;
void CreateBiTree(BiTree &T)
{
ElemType ch;
cin>>ch;
if(ch=='#')
T = NULL;
else
{
if (!(T = new BiTreeNode))
exit(OVERFLOW);
T->data = ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
} // CreateBiTree
void PreOrder(BiTree &T)//递归函数:先序遍历以T为根的二叉树。
{
if(T !=NULL) //递归结束条件
{
cout<
PreOrder(T->lchild); //先序遍历根的左子树
PreOrder(T->rchild); //先序遍历根的右子树}
}
void InOrder(BiTree &T)//递归函数:中序次序遍历以T为根的子树。
{
if(T !=NULL) //NULL是递归终止条件
{
InOrder(T->lchild); //中序遍历根的左子树
cout<
InOrder(T->rchild); //中序遍历根的右子树}
}
void PostOrder(BiTree &T)//递归函数:后序次序遍历以T为根的子树。
{
if(T !=NULL) //NULL是递归终止条件
{
PostOrder(T->lchild); //后序遍历根的左子树
PostOrder(T->rchild); //后序遍历根的右子树
cout<
}
}
void LevelOrder(BiTree T)//层序遍历{
BiTree Q[MaxLength];
int front=0,rear=0;
BiTree p;
if(T)//根结点入队
{
Q[rear]=T;
rear=(rear+1)%MaxLength;
}
while(front!=rear)
{
p=Q[front]; //队头元素出队
front=(front+1)%MaxLength;
cout<
if(p->lchild)//左孩子不为空,入队
{
Q[rear]=p->lchild;
rear=(rear+1)%MaxLength;
}
if(p->rchild)//右孩子不为空,入队
{
Q[rear]=p->rchild;
rear=(rear+1)%MaxLength;
}
}
}
bool Complete(BiTree T)
{
BiTree Q[MaxLength];
int front=0,rear=0;
BiTree p;
if(T==NULL)//根结点入队
{
return true;
}
else
{
Q[rear]=T;
rear=(rear+1)%MaxLength; while(front!=rear)
{
p=Q[front]; //队头元素出队
front=(front+1)%MaxLength;
if(p)
{
Q[rear]=p->lchild;
rear=(rear+1)%MaxLength;
Q[rear]=p->rchild;
rear=(rear+1)%MaxLength;
}
else
{
while(front!=rear)
{
p=Q[front];
if(p)
{
return false;
}
else
{
return true;
}
}
}
}
return true;
}
}
int Depth(BiTree T)
{
int depthval,depthleft,depthright;
if(!T)
{
depthval=0;
}
else
{
depthleft = Depth(T->lchild);
depthright = Depth(T->rchild);