C 创建二叉树及操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
typedef struct BiTreeNode{ ElemType data; struct BiTreeNode *lchild,*rchild;
}BiTreeNode,*BiTree;
void CreateBiTree(BiTree &T) {
ElemType ch; cin>>ch; if(ch=='#') T = NULL;
void PreOrder(BiTree &T)//递归函数:先序遍历以 T 为根的二
百度文库叉树。
{
if(T !=NULL)
//递归结束条件
{
cout<<T->data<<" ";//访问根结点
PreOrder(T->lchild);
//先序遍历根的左子树
PreOrder(T->rchild);
//先序遍历根的右子树
bool t = Complete(tree); if(t) {
cout<<"此二叉树是完全二叉树。"<<endl; } else {
cout<<"此二叉树不是完全二叉树。"<<endl; } cout<<"此二叉树的深度为:"; int m=Depth(tree); cout<<m<<endl; cout<<"此二叉树的总结点个数为:"; int n=Countleafs(tree); cout<<n<<endl; cout<<"此二叉树的叶子结点个数为:"; int a=Countleaf(tree); cout<<a<<endl; }
}
void PostOrder(BiTree &T)//递归函数:后序次序遍历以 T 为 根的子树。 {
if(T !=NULL) //NULL 是递归终止条件 {
PostOrder(T->lchild); //后序遍历根的左子树 PostOrder(T->rchild); //后序遍历根的右子树
cout<<T->data<<" "; //访问根结点
int m,n; if(!T) {
return 0; } if(!T->lchild && !T->rchild) {
return 1; } else {
m = Countleafs(T->lchild); n = Countleafs(T->rchild); return (m+n+1); } }
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)//根结点入队 {
BiTree.cpp 文件 #include "BiTree.h" void main() {
cout<<"Made by Fly!!~~"<<endl; cout<<"请输入二叉树序列,如:AB#C##D##"<<endl; BiTree tree; CreateBiTree(tree); cout<<"二叉树创建完成!~~"<<endl; cout<<"先序遍历二叉树输出结果:"; PreOrder(tree); cout<<endl; cout<<"中序遍历二叉树输出结果:"; InOrder(tree); cout<<endl; cout<<"后序遍历二叉树输出结果:"; PostOrder(tree); cout<<endl; cout<<"层次遍历二叉树输出结果:"; LevelOrder(tree); cout<<endl; cout<<"层次遍历二叉树判定是否为完全二叉树:"<<endl;
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 {
}
}
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<<p->data<<" "; if(p->lchild)//左孩子不为空,入队 {
else
{
if (!(T = new BiTreeNode))
exit(OVERFLOW);
T->data = ch;
// 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
} // CreateBiTree
BiTree.h 文件 #include <iostream.h> #include <stdlib.h> #include <stdio.h>
#define OK
1
#define ERROR
0
#define OVERFLOW -2
typedef char ElemType;
const int MaxLength=30;//结点个数不超过 30 个
depthleft = Depth(T->lchild); depthright = Depth(T->rchild);
depthval = 1 +(depthleft>depthright ? depthleft:depthright);
} return depthval; }
int Countleaf(BiTree T) {
}
}
void InOrder(BiTree &T)//递归函数:中序次序遍历以 T 为根 的子树。 {
if(T !=NULL) //NULL 是递归终止条件 {
InOrder(T->lchild); //中序遍历根的左子树 cout<<T->data<<" "; //访问根结点 InOrder(T->rchild); //中序遍历根的右子树 }
int m,n; if(!T) {
return 0; } if(!T->lchild && !T->rchild) {
return 1; } else {
m = Countleaf(T->lchild); n = Countleaf(T->rchild); return (m+n);
} }
int Countleafs(BiTree T) {
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) {