实现树与二叉树的转换

算法介绍在代码注释上,时间有限,未测试^^

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1010;
typedef int ElemType;
typedef struct Forest{
	int data;
	Forest *child[N];
}Forest;
typedef struct Tree{
	int data;
	Tree *left,*right;
}Tree;
Tree *ForestToBiTree(Forest *F){		//树转二叉树 
	if(F==NULL) return NULL;
	Tree *T=new Tree;
	T->data=F->data;
	T->left=T->right=NULL;
	queue<Forest*>fq;
	queue<Tree*>tq;
	fq.push(F);							//树和二叉树同时存入队列 
	tq.push(T);
	while(!fq.empty()){
		Forest *f=fq.front(); fq.pop();	//同时取出 
		Tree *t=tq.front(); tq.pop();	//每次操作都是对树一个节点的孩子进行操作 
		Tree *p=NULL;
		for(int i=0;i<N;i++){
			if(f->child[i]==NULL) break;
			Tree *node=new Tree;
			node->data=f->child[i]->data;
			node->left=node->right=NULL;
			if(i==0){
				t->left=node;			//树第一个节点为二叉树的左孩子 
			}
			else {
				p->right=node;			//其余节点为上面左节点的右孩子 
			}
			p=node;
			
			fq.push(f->child[i]);
			tq.push(node);
 		}	
	}
	return T;
}
Forest *BiTreeToForest(Tree *T){
	if(T==NULL) return NULL;
	Forest *F=new Forest;
	F->data=T->data;
	F->child[0]=NULL;
	queue<Tree*>tq;
	queue<Forest*>fq;
	tq.push(T);
	fq.push(F);							//树和二叉树同时存入队列 
	while(tq.empty()){
		Tree *t=tq.front(); tq.pop();	//每次操作都是对树一个节点的孩子进行操作 
		Forest *f=fq.front(); fq.pop();	//同时取出 
		int i=0;
		if(t->left){					//分别将二叉树节点的左孩子和左孩子后面的右孩子作为树的孩子节点 
			Forest *p=new Forest;
			p->data=t->left->data; p->child[0]=NULL;
			f->child[i++]=p;
			fq.push(p);
			tq.push(t->left);
		}		
		t=t->left->right;
		while(t){
			Forest *p=new Forest;
			p->data=t->data; p->child[0]=NULL;
			f->child[i++]=p;
			fq.push(p);
			tq.push(t);
			t=t->right;
		}		
	}
	return F;
}
int main()
{
	return 0;
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值