实现一般树转换成二叉树

1 需求分析
1.1 课题功能需求分析
(1) 设计内容:
a、建立一棵树;
b、将树转换成二叉树;
c、实现二叉树的前序、中序、后序的递归和非递归遍历算法。
(2) 设计要求:
a、符合课题要求,实现树与二叉树的转换
1.2 课题开发工具及环境分析
使用VC++6.0工具
1.3 课题相关数据结构原理分析
树和二叉树不同,可以有0-n个孩子,该程序设计中,借助树的孩子兄弟表示法吧树转换成二叉树。在孩子兄弟表示法中,某个节点的第一个孩子节点额指针是二叉树中做孩子节点指针,右兄弟节点指针是二叉树中右孩子节点指针。利用树与二叉树之间的连线、去线、旋转实现树与二叉树之间的转换。

2 概要设计
2.1 系统结构设计

2.2 类、函数、接口、方法设计

BTNode *change(PTree T)
PTree CreatTree(PTree T)
void print_ptree(PTree tree)
void PrintBTree(BTNode *root,int level)
void level(PTree T)
void inorder2(PTree T)
void inorder(BTNode *T)
void preorder2(PTree T)
void preorder(BTNode *T)

3 详细设计

3.1 分模块流程设计
3.1.1定义程序中所用到的数据及其数据结构

#include<stdio.h>
#include
#include<malloc.h>
#include<stdlib.h>

using namespace std;
#define MAXSIZE 100
//节点结构
typedef struct{
int data;
int parent; //双亲指针域
}PTNode;

//树结构(双亲表示法)
typedef struct{
PTNode node[MAXSIZE];
int count;//根的位置和节点个数
}PTree;

//树的孩子兄弟表示节点结构定义
typedef struct node{
int data;
struct node *firstchild;
struct node *rightsib;
}BTNode,*BTree;
//初始化树
void init_ptree(PTree *tree){
tree->count=-1;
}
//初始化树结点(孩子兄弟表示法)
BTNode GetTreeNode(int x){
BTNode t;
t.data=x;
t.firstchild=t.rightsib=NULL;
return t;
}
//初始化树
void init_ptree(PTree *tree){
tree->count=-1;
}
//初始化树结点(孩子兄弟表示法)
BTNode GetTreeNode(int x){
BTNode t;
t.data=x;
t.firstchild=t.rightsib=NULL;
return t;
}
//树的前序遍历(递归)
void preorder(BTNode *T)
{
if(T!=NULL){
printf("%d “,T->data);
preorder(T->firstchild);
preorder(T->rightsib);
}
}
//树的前序遍历(非递归)
void preorder2(PTree T)
{
int i;
for(i=0;i<T.count;i++)
{
printf(”%d “,T.node[i]);
}
}
//树后序遍历(递归)
void inoeder(BTNode *T)
{
if(T!=NULL)
{
inoeder(T->firstchild);
printf(”%d “,T->data);
inoeder(T->rightsib);
}
}
//树后序遍历(非递归)
void inoeder2(PTree T)
{
int i;
for(i=T.count-1;i>=0;i–)
{
printf(”%d “,T.node[i]);
}
}
//层次遍历
void level(PTree T)
{
int i;
for(i=0;i<T.count;i++)
{
printf(”%d “,T.node[i]);
}
}
//水平输出二叉树
void PrintBTree(BTNode root,int level)
{
int i;
if(root!=NULL)
{
PrintBTree(root->rightsib,level+1);
for(i=1;i<=8
level;i++)
printf(” “);
printf(”-------%d\n",root->data);
PrintBTree(root->firstchild,level+1);
}
}
//输出树
void print_ptree(PTree tree)
{
int i;
printf(" 序号 结点 双亲\n");
for(i=0;i<=tree.count;i++)
{
printf("%8d%8d%8d",i,tree.node[i].data,tree.node[i].parent);
printf("\n");
}
}
/用双亲表示法创建树/
PTree CreatTree(PTree T)
{
int i=1;
int fa,ch;
PTNode p;
while(ch!=-2)
{
printf(“输入第%d结点:\n”,i);
cin>>fa>>ch;
// cout<<ch;
printf("\n");
i++;
p.data=ch;
p.parent=fa;
T.count++;
T.node[T.count].data = p.data;
T.node[T.count].parent = p.parent;

}
printf("\n");
printf(“创建的树具体情况如下:\n”);
print_ptree(T);
return T;
}
/一般树转换成二叉树/
BTNode *change(PTree T){
int i,j=0;
BTNode p[MAXSIZE];
BTNode *ip,*is,*ir,*Tree;
ip=(BTNode *)malloc(sizeof(BTNode));
is=(BTNode *)malloc(sizeof(BTNode));
ir=(BTNode *)malloc(sizeof(BTNode));
Tree=(BTNode *)malloc(sizeof(BTNode));
for(i=0;i<T.count;i++){
p[i]=GetTreeNode(T.node[i].data);
}
for(i=1;i<T.count;i++){
ip=&p[i];
is=&p[j];
while(T.node[i].parent!=is->data){
j++;
is=&p[j];
}
if(!(is->firstchild)){
is->firstchild=ip;
ir=ip;
}else{
ir->rightsib=ip;
ir=ip;
}
}
Tree=&p[0];
return Tree;
}

3.2 分模块函数介绍和说明
3.2.1 主菜单
/主菜单/
void Menu()
{
cout<<("=主菜单=\n")<<endl;
cout<<(“输入1-------------以双亲法创建一棵一般树\n”);
cout<<(“输入2-------------树的前序遍历(递归)\n");
cout<<("输入3-------------树的后序遍历(递归)
\n”);
cout<<(“输入4-------------树的前序遍历(非递归)\n");
cout<<("输入5-------------树的后序遍历(非递归)
\n”);
cout<<(“输入6-------------层次序的非递归遍历****\n”);
cout<<(“输入0-------------退出程序**************\n”);
cout<<("
============================================\n");
cout<<(“请输入执行的指令:”);
}
/副菜单/
void Menu2()
{
cout<<(“副菜单**\n”)<<endl;
cout<<(“9-------------返回主菜单继续操作****\n”);
cout<<(“0-------------退出程序**************\n”);
}
3.2.2 主函数

/主函数/
void main(){
int i=0,c1,c2;
PTree T;
BTNode *Tree;
init_ptree(&T);
loop:
Menu();
scanf("%d",&c1);
switch(c1){
case 1:
cout<<“建立一般树,依次输入各个结点情况:\n”;
cout<<“输入结点方式:双亲数据,整型数据(第一个结点双亲数据为负数,最后以-2 -2结束)\n例子:-1 1 \n”;
T=CreatTree(T);
Tree=change(T);
cout<<“一般树转换成二叉树后的情况:\n”;
PrintBTree(Tree,i);
getchar();
break;
case 2:
printf(“树的前序遍历(递归):\n”);
preorder(Tree);
printf("\n");
break;
case 3:
printf(“树的后序遍历(递归):\n”);
inorder(Tree);
printf("\n");
break;
case 4:
printf(“树的前序遍历(非递归):\n”);
preorder2(T);
printf("\n");
break;
case 5:
printf(“树的后序遍历(非递归):\n”);
inorder2(T);
printf("\n");
break;
case 6:
printf(“树的层次遍历:\n”);
level(T);
printf("\n");
break;
case 0:
exit(1);
break;
}
Menu2();
cin>>c2;
if(c29)
goto loop;
else if(c2
0)
exit(1);
}

3.2.3 函数方法介绍及说明

BTNode *change(PTree T):将一般树转化成二叉树
PTree CreatTree(PTree T):创建一般树
void print_ptree(PTree tree):输出一般树
void PrintBTree(BTNode *root,int level):输出二叉树
void level(PTree T):水平输出一般树
void inorder2(PTree T):树的非递归后序遍历
void inorder(BTNode *T):树的后序遍历(递归)
void preorder2(PTree T):树的非递归前序遍历
void preorder(BTNode *T):树的前序遍历(递归)
Loop():实现跳转等

  • 12
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值